Bagaimana cara mengirim respons 404 secara terprogram dengan Express / Node?

185

Saya ingin mensimulasikan kesalahan 404 pada server Express / Node saya. Bagaimana saya bisa melakukan itu?

Randomblue
sumber
7
Bagaimana "disimulasikan" berbeda dari yang "nyata"?
Jon Hanna

Jawaban:

273

Saat ini ada statusfungsi khusus untuk ini pada objek respons. Rangkai saja di suatu tempat sebelum Anda menelepon send.

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');
Drew Noakes
sumber
7
Ini juga berfungsi dengan halaman yang diberikan:res.status(404).render('error404')
jmu
20
Perlu dicatat bahwa itu sendiri res.status(404);tidak akan mengirim respons AFAIK. Itu perlu dirantai dengan sesuatu, misalnya res.status(404).end();atau contoh kedua Anda, atau perlu diikuti oleh misalnya res.end();,res.send('Not found');
UpTheCreek
1
@UpTheCreek, saya akan menghapus contoh pertama dari kode untuk menghindari potensi kebingungan itu.
Drew Noakes
1
versi lebih pendekres.sendStatus(404)
bentesha
47

Jawaban yang Diperbarui untuk Express 4.x

Daripada menggunakan res.send(404)seperti dalam versi Express yang lama, metode baru adalah:

res.sendStatus(404);

Express akan mengirimkan respons 404 yang sangat mendasar dengan teks "Tidak Ditemukan":

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
sumber
1
Saya cukup yakin itu res.status(404)tidak benar res.sendStatus(404).
Jake Wilson
4
res.sendStatus(404)benar. Ini sama denganres.status(404).send()
Justin Johnson
2
Yap res.sendStatus(404); setara dengan res.status(404).send('Not Found')
Rick
@JakeWilson sekarang apa itu ??
blacksheep
43

Anda tidak perlu mensimulasikannya. Argumen kedua yang res.sendsaya percayai adalah kode status. Lewati saja 404 ke argumen itu.

Biarkan saya mengklarifikasi bahwa: Per dokumentasi pada expressjs.org tampaknya seolah-olah nomor apa pun yang lewat res.send()akan ditafsirkan sebagai kode status. Jadi secara teknis Anda bisa lolos dengan:

res.send(404);

Sunting: Sayang saya, saya maksudkan resbukan req. Itu harus dipanggil pada respon

Sunting: Pada Express 4, send(status)metode ini telah usang. Jika Anda menggunakan Express 4 atau lebih baru, gunakan: res.sendStatus(404)sebagai gantinya. (Terima kasih @badcc untuk tip di komentar)

rossipedia
sumber
1
Anda juga dapat mengirim pesan dengan 404: res.send(404, "Could not find ID "+id)
Pylinux
Mengirim kode status langsung tidak lagi digunakan dalam 4.x dan mungkin akan dihapus pada titik tertentu. Terbaik untuk digunakan.status(404).send('Not found')
Matt Fletcher
2
Untuk Express 4: "express res.send usang (status): Gunakan res.sendStatus (status) sebagai gantinya"
badcc
10

Menurut situs yang akan saya posting di bawah, ini adalah cara Anda mengatur server Anda. Salah satu contoh yang mereka tunjukkan adalah ini:

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;

dan fungsi rute mereka:

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;

Ini satu arah. http://www.nodebeginner.org/

Dari situs lain, mereka membuat halaman dan kemudian memuatnya. Ini mungkin lebih dari apa yang Anda cari.

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

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

tempurung kepala
sumber
9

Dari situs Express , tentukan pengecualian NotFound dan buang setiap kali Anda ingin memiliki 404 halaman ATAU redirect ke / 404 dalam kasus di bawah ini:

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
sumber
1
Contoh kode ini tidak lagi di tautan yang Anda referensi. Mungkinkah ini berlaku untuk versi ekspres yang lebih lama?
Drew Noakes
Ini sebenarnya masih berlaku untuk kode yang ada, yang harus Anda lakukan adalah menggunakan menangani kesalahan middleware untuk menangkap kesalahan. Contoh: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 cara terbaik adalah menggunakan next()fungsi ini:

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

Kemudian kesalahan ditangani oleh penangan kesalahan Anda dan Anda dapat menata kesalahan dengan baik menggunakan HTML.

Sam
sumber