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

185

Quiero simular un error 404 en mi servidor Express / Node. ¿Cómo puedo hacer eso?

Randomblue
fuente
77
¿En qué diferiría "simulado" de uno "real"?
Jon Hanna

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');
Drew Noakes
fuente
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
Puntilla
fuente
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)

rossipedia
fuente
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

cráneo vacío
fuente
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!');
});
alessioalex
fuente
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.

Sam
fuente