Come inviare a livello di codice una risposta 404 con Express / Node?


Risposte:


273

Oggi c'è una statusfunzione dedicata per questo sull'oggetto risposta. Basta incatenarlo da qualche parte prima di chiamare send.

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

7
Questo funziona anche con le pagine renderizzate:res.status(404).render('error404')
jmu

20
Vale la pena notare che da solo res.status(404);non invierà una risposta AFAIK. Deve essere incatenato con qualcosa, ad esempio res.status(404).end();o il tuo secondo esempio, oppure deve essere seguito da ad esempio res.end();,res.send('Not found');
UpTheCreek

1
@UpTheCreek, rimuoverò il primo esempio dal codice per evitare il potenziale per quella confusione.
Drew Noakes,

1
versione più cortares.sendStatus(404)
bentesha

47

Risposta aggiornata per Express 4.x

Invece di utilizzare res.send(404)come nelle vecchie versioni di Express, il nuovo metodo è:

res.sendStatus(404);

Express invierà una risposta 404 di base con il testo "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
Sono abbastanza sicuro che res.status(404)non lo sia res.sendStatus(404).
Jake Wilson,

4
res.sendStatus(404)è corretto. È equivalente ares.status(404).send()
Justin Johnson,

2
Sì, res.sendStatus(404); equivale a res.status(404).send('Not Found')
Rick,

@JakeWilson ora che cos'è ??
blacksheep,

43

Non devi simularlo. Il secondo argomento a res.sendmio avviso è il codice di stato. Basta passare 404 a tale argomento.

Vorrei chiarire che: secondo la documentazione su expressjs.org sembra che qualsiasi numero passato res.send()venga interpretato come codice di stato. Quindi tecnicamente potresti cavartela con:

res.send(404);

Modifica: Mio male, intendevo resinvece di req. Dovrebbe essere chiamato sulla risposta

Modifica: a partire da Express 4, il send(status)metodo è stato deprecato. Se si utilizza Express 4 o versioni successive, utilizzare: res.sendStatus(404)invece. (Grazie @badcc per la segnalazione nei commenti)


1
Puoi anche inviare un messaggio con il 404: res.send(404, "Could not find ID "+id)
Pylinux

L'invio diretto di un codice di stato è deprecato in 4.x e probabilmente verrà rimosso a un certo punto. Meglio restare con.status(404).send('Not found')
Matt Fletcher il

2
Per Express 4: "espresso res.send deprecato (stato): utilizzare invece res.sendStatus (stato)"
badcc

10

Secondo il sito che posterò di seguito, è tutto come si configura il server. Un esempio che mostrano è questo:

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;

e la loro funzione di rotta:

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;

Questo è un modo. http://www.nodebeginner.org/

Da un altro sito, creano una pagina e la caricano. Questo potrebbe essere più di quello che stai cercando.

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

Dal sito Express , definire un'eccezione NotFound e lanciarla ogni volta che si desidera avere una pagina 404 O reindirizzare a / 404 nel caso seguente:

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
Questo codice di esempio non si trova più nel collegamento a cui fai riferimento. Potrebbe applicarsi a una versione precedente di express?
Drew Noakes,

In realtà si applica al codice esistente, tutto quello che devi fare è usare il middleware handle di errore per rilevare l'errore. Esempio: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 il modo migliore è usare la next()funzione:

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

Quindi l'errore viene gestito dal gestore degli errori e puoi modellarlo correttamente usando HTML.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.