Express4 / Node ile programlı olarak 404 yanıtı nasıl gönderilir?


186

Express / Node sunucumda 404 hatasını simüle etmek istiyorum. Bunu nasıl yapabilirim?


7
"Simüle edilen" ile "gerçek" olan arasındaki fark nedir?
Jon Hanna

Yanıtlar:


274

Günümüzde yanıt nesnesinde bunun için özel bir statusişlev vardır . Aramadan önce bir yere zincirleyin send.

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

7
Bu ayrıca işlenmiş sayfalarla da çalışır:res.status(404).render('error404')
jmu

20
Kendi başına res.status(404);bir cevap göndermeyeceğimizi belirtmek AFAIK. Bir şeyle zincirlenmesi gerekiyor, örneğin res.status(404).end();veya ikinci örneğiniz veya bunu takip etmek gerekiyor, örneğin res.end();,res.send('Not found');
UpTheCreek

1
@UpTheCreek, bu karışıklık potansiyelinden kaçınmak için koddan ilk örneği kaldıracağım.
Drew Noakes

1
daha kısa versiyonres.sendStatus(404)
bentesha

47

Express 4.x için Güncel Yanıt

res.send(404)Express'in eski sürümlerinde olduğu gibi kullanmak yerine , yeni yöntem:

res.sendStatus(404);

Express, "Bulunamadı" metniyle çok temel bir 404 yanıtı gönderecektir:

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
Eminim sadece res.status(404)değil res.sendStatus(404).
Jake Wilson

4
res.sendStatus(404)doğru. Eşdeğerres.status(404).send()
Justin Johnson

2
Yep res.sendStatus(404); eşdeğer res.status(404).send('Not Found')
Rick

@ JakeWilson şimdi nedir ??
blacksheep

43

Bunu simüle etmek zorunda değilsiniz. İkinci argümanın res.senddurum kodu olduğuna inanıyorum. Sadece 404'ü bu argümana ilet.

Şunu açıklığa kavuşturalım: expressjs.org üzerindeki belgelere göre, iletilen herhangi bir sayı res.send()durum kodu olarak yorumlanacak gibi görünüyor . Yani teknik olarak aşağıdakilerden kurtulabilirsiniz:

res.send(404);

Düzenleme: Benim kötü, resyerine demek istedim req. Yanıt üzerine çağrılmalıdır

Düzenleme: Express 4'ten itibaren send(status)yöntem kullanımdan kaldırılmıştır. Express 4 veya üstünü kullanıyorsanız: tuşunu res.sendStatus(404)kullanın. (Yorumlardaki ipucu için teşekkürler @ badcc)


1
Ayrıca 404 ile bir mesaj gönderebilirsiniz: res.send(404, "Could not find ID "+id)
Pylinux

Bir durum kodunun doğrudan gönderilmesi 4.x'te kaldırılmıştır ve muhtemelen bir noktada kaldırılacaktır. En iyi sopa ile.status(404).send('Not found')
Matt Fletcher

2
Express 4 için: "kullanımdan kaldırılmış res.send (durum): Bunun yerine res.sendStatus (durum) kullan"
badcc

10

Aşağıda yayınlayacağım siteye göre, sunucunuzu nasıl ayarladığınız budur. Gösterdikleri bir örnek şudur:

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;

ve rota işlevleri:

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;

Bu bir yol. http://www.nodebeginner.org/

Başka bir siteden bir sayfa oluştururlar ve sonra yüklerler. Bu aradığınız şeyden daha fazlası olabilir.

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

Gönderen Ekspres sitesinde , bir NotFound istisna tanımlayabilirsiniz ve aşağıda durumunda / '404 bir 404 sayfası VEYA yönlendirmeniz istediğinizde atmak:

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
Bu örnek kod artık başvurduğunuz bağlantıda değil. Bu, ekspresin önceki bir sürümü için geçerli olabilir mi?
Drew Noakes

Aslında stil mevcut kod için geçerlidir, tek yapmanız gereken hatayı yakalamak için hata tanıma orta katman yazılımını kullanmaktır. Örn: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 en güzel yolu next()fonksiyonu kullanmaktır :

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

Daha sonra hata, hata işleyiciniz tarafından işlenir ve hatayı HTML kullanarak güzel bir şekilde şekillendirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.