¿Cómo enviar mediante programación una respuesta 404 con Express / Node?


Respuestas:


273

Hoy en día hay una statusfunción dedicada para esto en el objeto de respuesta. Simplemente encadenarlo en algún lugar antes de llamar send.

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');

77
Esto también funciona con páginas renderizadas:res.status(404).render('error404')
— jmu

20
Vale la pena señalar que por sí solo res.status(404);no enviará una respuesta AFAIK. Debe estar encadenado con algo, por ejemplo, res.status(404).end();o su segundo ejemplo, o debe ser seguido por res.end();, por ejemplo ,res.send('Not found');
— UpTheCreek

1
@UpTheCreek, eliminaré el primer ejemplo del código para evitar la posibilidad de esa confusión.
— Drew Noakes

1
versión más cortares.sendStatus(404)
— bentesha

47

Respuesta actualizada para Express 4.x

En lugar de usar res.send(404)como en versiones anteriores de Express, el nuevo método es:

res.sendStatus(404);

Express enviará una respuesta 404 muy básica con el texto "No encontrado":

HTTP/1.1 404 Not Found
X-Powered-By: Express
Vary: Origin
Content-Type: text/plain; charset=utf-8
Content-Length: 9
ETag: W/"9-nR6tc+Z4+i9RpwqTOwvwFw"
Date: Fri, 23 Oct 2015 20:08:19 GMT
Connection: keep-alive

Not Found

1
Estoy bastante seguro de que simplemente res.status(404)no lo es res.sendStatus(404).
— Jake Wilson

44
res.sendStatus(404)es correcto. Es equivalente ares.status(404).send()
— Justin Johnson

2
Sí res.sendStatus(404); es equivalente a res.status(404).send('Not Found')
— Rick

@JakeWilson ahora, ¿qué es?
— blacksheep

43

No tienes que simularlo. El segundo argumento para res.sendcreer es el código de estado. Simplemente pasa 404 a ese argumento.

Permítanme aclarar que: según la documentación en expressjs.org parece que cualquier número pasado res.send()será interpretado como el código de estado. Entonces técnicamente podrías salirte con la tuya:

res.send(404);

Editar: Mi mal, quise decir en reslugar de req. Debería ser llamado en la respuesta

Editar: a partir de Express 4, el send(status)método ha quedado en desuso. Si está utilizando Express 4 o posterior, use: en su res.sendStatus(404)lugar. (Gracias @badcc por el consejo en los comentarios)


1
También puede enviar un mensaje con el 404: res.send(404, "Could not find ID "+id)
— Pylinux

Enviar un código de estado directamente está en desuso en 4.xy probablemente se eliminará en algún momento. Mejor seguir con.status(404).send('Not found')
— Matt Fletcher

2
Para Express 4: "express en desuso res.send (estado): use res.sendStatus (estado) en su lugar"
— badcc

10

Según el sitio que publicaré a continuación, todo es cómo configura su servidor. Un ejemplo que muestran es este:

var http = require("http");
var url = require("url");

function start(route, handle) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(handle, pathname, response);
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

y su función de ruta:

function route(handle, pathname, response) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response);
  } else {
    console.log("No request handler found for " + pathname);
    response.writeHead(404, {"Content-Type": "text/plain"});
    response.write("404 Not found");
    response.end();
  }
}

exports.route = route;

Esta es una forma. http://www.nodebeginner.org/

Desde otro sitio, crean una página y luego la cargan. Esto podría ser más de lo que estás buscando.

fs.readFile('www/404.html', function(error2, data) {
            response.writeHead(404, {'content-type': 'text/html'});
            response.end(data);
        });

http://blog.poweredbyalt.net/?p=81


9

Desde el sitio Express , defina una excepción NotFound y tírela cuando desee tener una página 404 O redirija a / 404 en el siguiente caso:

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){
  throw new NotFound;
});

app.get('/500', function(req, res){
  throw new Error('keyboard cat!');
});

1
Este código de ejemplo ya no está en el enlace al que hace referencia. ¿Podría esto aplicarse a una versión anterior de express?
— Drew Noakes

En realidad, todavía se aplica al código existente, todo lo que tiene que hacer es usar el middleware de control de errores para detectar el error. Ej:app.use(function(err, res, res, next) { if (err.message.indexOf('NotFound') !== -1) { res.status(400).send('Not found dude'); }; /* else .. etc */ });
— alessioalex

0

En mi opinión, la mejor manera es usar la next()función:

router.get('/', function(req, res, next) {
    var err = new Error('Not found');
    err.status = 404;
    return next(err);
}

Luego, el controlador de errores maneja el error y puede diseñar el error muy bien usando HTML.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.