Comment envoyer par programme une réponse 404 avec Express / Node?


186

Je souhaite simuler une erreur 404 sur mon serveur Express / Node. Comment puis je faire ça?


7
En quoi le «simulé» différerait-il d'un «réel»?
Jon Hanna

Réponses:


274

De nos jours, il existe une statusfonction dédiée pour cela sur l'objet de réponse. Il suffit de l'enchaîner quelque part avant d'appeler send.

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

7
Cela fonctionne également avec les pages rendues:res.status(404).render('error404')
jmu

20
Il convient de noter que seul res.status(404);n'enverra pas de réponse AFAIK. Il doit être enchaîné avec quelque chose, par exemple res.status(404).end();ou votre deuxième exemple, ou il doit être suivi par exemple res.end();,res.send('Not found');
UpTheCreek

1
@UpTheCreek, je vais supprimer le premier exemple du code pour éviter le risque de confusion.
Drew Noakes

1
version courteres.sendStatus(404)
bentesha

47

Réponse mise à jour pour Express 4.x

Plutôt que d'utiliser res.send(404)comme dans les anciennes versions d'Express, la nouvelle méthode est:

res.sendStatus(404);

Express enverra une réponse 404 très basique avec le texte "Not Found":

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
Je suis presque sûr que ce n'est res.status(404)pas le cas res.sendStatus(404).
Jake Wilson

4
res.sendStatus(404)est correct. C'est équivalent àres.status(404).send()
Justin Johnson le

2
Ouais res.sendStatus(404); est équivalent à res.status(404).send('Not Found')
Rick

@JakeWilson maintenant qu'est-ce que c'est ??
blacksheep

43

Vous n'avez pas à le simuler. Le deuxième argument à res.sendmon avis est le code de statut. Passez simplement 404 à cet argument.

Permettez-moi de préciser que: d'après la documentation sur expressjs.org, il semble que tout numéro passé à res.send()sera interprété comme le code d'état. Donc, techniquement, vous pourriez vous en tirer avec:

res.send(404);

Edit: Mon mauvais, je voulais dire resau lieu de req. Il devrait être appelé sur la réponse

Edit: Depuis Express 4, la send(status)méthode est obsolète. Si vous utilisez Express 4 ou une version ultérieure, utilisez: à la res.sendStatus(404)place. (Merci @badcc pour la pointe dans les commentaires)


1
Vous pouvez également envoyer un message avec le 404: res.send(404, "Could not find ID "+id)
Pylinux

L'envoi direct d'un code d'état est obsolète dans 4.x et sera probablement supprimé à un moment donné. Mieux vaut rester avec.status(404).send('Not found')
Matt Fletcher

2
Pour Express 4: "express obsolète res.send (status): utilisez res.sendStatus (status) à la place"
badcc

10

Selon le site que je publierai ci-dessous, tout dépend de la configuration de votre serveur. Un exemple qu'ils montrent est celui-ci:

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;

et leur fonction d'itinéraire:

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;

C'est une façon. http://www.nodebeginner.org/

À partir d'un autre site, ils créent une page puis la chargent. C'est peut-être plus ce que vous recherchez.

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

Depuis le site Express , définissez une exception NotFound et lancez-la chaque fois que vous souhaitez avoir une page 404 OU redirigez vers / 404 dans le cas ci-dessous:

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
Cet exemple de code ne se trouve plus sur le lien que vous référencez. Cela pourrait-il s'appliquer à une version antérieure d'Express?
Drew Noakes

Il s'applique toujours au code existant, tout ce que vous avez à faire est d'utiliser le middleware de gestion des erreurs pour détecter l'erreur. Ex:app.use(function(err, res, res, next) { if (err.message.indexOf('NotFound') !== -1) { res.status(400).send('Not found dude'); }; /* else .. etc */ });
alessioalex

0

IMO, la meilleure façon est d'utiliser la next()fonction:

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

Ensuite, l'erreur est gérée par votre gestionnaire d'erreurs et vous pouvez styler correctement l'erreur en utilisant HTML.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.