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


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');

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

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)


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


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!');
});

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.