¿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
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.