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.