Wie kann ich programmgesteuert eine 404-Antwort mit Express / Node senden?

185

Ich möchte einen 404-Fehler auf meinem Express / Node-Server simulieren. Wie kann ich das machen?

Zufälliges Blau
quelle
7
Wie würde sich "simuliert" von einem "echten" unterscheiden?
Jon Hanna

Antworten:

273

Heutzutage gibt es dafür eine spezielle statusFunktion für das Antwortobjekt. Verketten Sie es einfach irgendwo, bevor Sie anrufen send.

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');
Drew Noakes
quelle
7
Dies funktioniert auch mit gerenderten Seiten:res.status(404).render('error404')
jmu
20
Es ist erwähnenswert, dass res.status(404);AFAIK alleine keine Antwort sendet. Es muss entweder mit etwas, zum Beispiel verkettet werden res.status(404).end();oder Ihr zweites Beispiel, oder muss sie von zB befolgt werden res.end();,res.send('Not found');
UpTheCreek
1
@UpTheCreek, ich werde das erste Beispiel aus dem Code entfernen, um die Möglichkeit dieser Verwirrung zu vermeiden.
Drew Noakes
1
kürzere Versionres.sendStatus(404)
Bentesha
47

Aktualisierte Antwort für Express 4.x.

Anstatt res.send(404)wie in alten Express-Versionen zu verwenden, lautet die neue Methode:

res.sendStatus(404);

Express sendet eine sehr einfache 404-Antwort mit dem Text "Nicht gefunden":

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
Brad
quelle
1
Ich bin mir ziemlich sicher, dass es einfach res.status(404)nicht so ist res.sendStatus(404).
Jake Wilson
4
res.sendStatus(404)ist richtig. Es ist gleichbedeutend mitres.status(404).send()
Justin Johnson
2
Ja res.sendStatus(404); ist gleichbedeutend mit res.status(404).send('Not Found')
Rick
@ JakeWilson jetzt was ist das?
Blacksheep
43

Sie müssen es nicht simulieren. Das zweite Argument ist res.sendmeines Erachtens der Statuscode. Übergeben Sie einfach 404 an dieses Argument.

Lassen Sie mich Folgendes klarstellen: Gemäß der Dokumentation auf expressjs.org scheint es, als würde jede an übergebene Nummer res.send()als Statuscode interpretiert. Technisch gesehen könnte man also davonkommen mit:

res.send(404);

Edit: Mein schlechtes, meinte ich resstatt req. Es sollte auf die Antwort aufgerufen werden

Bearbeiten: Ab Express 4 ist die send(status)Methode veraltet. Wenn Sie Express 4 oder höher verwenden, verwenden Sie res.sendStatus(404)stattdessen : . (Danke @badcc für den Tipp in den Kommentaren)

rossipedia
quelle
1
Sie können auch eine Nachricht mit dem 404 senden: res.send(404, "Could not find ID "+id)
Pylinux
Das direkte Senden eines Statuscodes ist in 4.x veraltet und wird wahrscheinlich irgendwann entfernt. Am besten bleiben Sie bei.status(404).send('Not found')
Matt Fletcher
2
Für Express 4: "Express veraltet res.send (Status): Verwenden Sie stattdessen res.sendStatus (Status)"
badcc
10

Laut der Website, die ich unten veröffentlichen werde, ist es alles, wie Sie Ihren Server einrichten. Ein Beispiel, das sie zeigen, ist folgendes:

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;

und ihre Routenfunktion:

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;

Dies ist eine Möglichkeit. http://www.nodebeginner.org/

Von einer anderen Site aus erstellen sie eine Seite und laden sie dann. Dies könnte mehr von dem sein, wonach Sie suchen.

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

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

Schädel leer
quelle
9

Definieren Sie auf der Express-Site eine NotFound-Ausnahme und lösen Sie sie aus, wenn Sie eine 404-Seite haben möchten, ODER leiten Sie im folgenden Fall zu / 404 um:

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
quelle
1
Dieser Beispielcode befindet sich nicht mehr unter dem Link, auf den Sie verweisen. Könnte dies auf eine frühere Version von Express zutreffen?
Drew Noakes
Es gilt tatsächlich immer noch für den vorhandenen Code. Alles, was Sie tun müssen, ist die Middleware mit Fehlerbehandlung zu verwenden, um den Fehler abzufangen. Beispiel: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 ist der schönste Weg, die next()Funktion zu verwenden:

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

Dann wird der Fehler von Ihrem Fehlerbehandler behandelt und Sie können den Fehler mithilfe von HTML gut formatieren.

Sam
quelle