วิธีการส่งการตอบกลับ 404 ด้วย Express / Node โดยทางโปรแกรม


185

ฉันต้องการจำลองข้อผิดพลาด 404 บนเซิร์ฟเวอร์ Express / Node ของฉัน ฉันจะทำสิ่งนั้นได้อย่างไร


7
"จำลอง" จะแตกต่างจาก "ของจริง" ได้อย่างไร
Jon Hanna

คำตอบ:


273

ทุกวันนี้มีstatusฟังก์ชั่นเฉพาะสำหรับสิ่งนี้บนวัตถุตอบสนอง sendเพียงแค่โซ่ไว้ในที่ใดที่หนึ่งก่อนที่คุณเรียก

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

7
สิ่งนี้ใช้ได้กับหน้าที่แสดงผล:res.status(404).render('error404')
jmu

20
เร็ว ๆ นี้ที่มันเป็นของตัวเองres.status(404);จะไม่ส่งการตอบสนอง AFAIK มันต้องอย่างใดอย่างหนึ่งจะถูกผูกมัดกับบางสิ่งบางอย่างเช่นres.status(404).end();หรือตัวอย่างที่สองของคุณหรือจะต้องตามมาด้วยเช่นres.end();,res.send('Not found');
UpTheCreek

1
@UpTheCreek ฉันจะลบตัวอย่างแรกจากโค้ดเพื่อหลีกเลี่ยงความสับสนที่อาจเกิดขึ้น
Drew Noakes

1
รุ่นที่สั้นกว่าres.sendStatus(404)
bentesha

47

อัพเดตคำตอบสำหรับ Express 4.x

แทนที่จะใช้res.send(404)เช่นเดียวกับใน Express เวอร์ชันเก่าวิธีการใหม่คือ:

res.sendStatus(404);

Express จะส่งการตอบกลับพื้นฐาน 404 ข้อความ "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
ผมค่อนข้างมั่นใจว่ามันเป็นเพียงแค่ไม่ได้res.status(404) res.sendStatus(404)
Jake Wilson

4
res.sendStatus(404)ถูกต้อง. มันเทียบเท่ากับres.status(404).send()
Justin Johnson

2
ใช่res.sendStatus(404); เทียบเท่ากับ res.status(404).send('Not Found')
Rick

@ JakeWilson ตอนนี้มันคืออะไร ??
blacksheep

43

คุณไม่จำเป็นต้องจำลองมัน อาร์กิวเมนต์ที่สองที่res.sendฉันเชื่อว่าเป็นรหัสสถานะ แค่ผ่าน 404 ไปยังอาร์กิวเมนต์นั้น

ฉันขอชี้แจงว่า: ตามเอกสารของ expressjs.orgดูเหมือนว่าหมายเลขใด ๆ ที่ส่งผ่านไปres.send()จะถูกตีความว่าเป็นรหัสสถานะ ดังนั้นในทางเทคนิคคุณสามารถหนีไปกับ:

res.send(404);

แก้ไข:ไม่ดีของฉันฉันหมายแทนres reqมันควรจะเรียกว่าการตอบสนอง

แก้ไข:ตั้งแต่ Express 4 send(status)วิธีได้รับการคัดค้าน หากคุณใช้ Express 4 หรือใหม่กว่าให้ใช้: res.sendStatus(404)แทน (ขอบคุณ @badcc สำหรับเคล็ดลับในความคิดเห็น)


1
คุณสามารถส่งข้อความด้วย 404: res.send(404, "Could not find ID "+id)
Pylinux

การส่งรหัสสถานะโดยตรงถูกคัดค้านใน 4.x และอาจถูกลบออกในบางจุด ดีที่สุดที่จะติดกับ.status(404).send('Not found')
Matt Fletcher

2
สำหรับ Express 4: "res.send (สถานะ) ที่คัดค้านอย่างรวดเร็ว: ใช้ res.sendStatus (สถานะ) แทน"
badcc

10

ตามเว็บไซต์ที่ฉันจะโพสต์ด้านล่างนี่คือทั้งหมดที่คุณตั้งค่าเซิร์ฟเวอร์ของคุณ ตัวอย่างหนึ่งที่พวกเขาแสดงคือ:

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;

และฟังก์ชั่นเส้นทางของพวกเขา:

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;

นี่เป็นวิธีหนึ่ง http://www.nodebeginner.org/

จากไซต์อื่นพวกเขาสร้างเพจแล้วโหลด นี่อาจเป็นสิ่งที่คุณกำลังมองหา

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

จากไซต์ Expressให้กำหนดข้อยกเว้น NotFound และโยนมันทุกครั้งที่คุณต้องการมีหน้า 404 หรือเปลี่ยนเส้นทางไปที่ / 404 ในกรณีด้านล่าง:

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
โค้ดตัวอย่างนี้ไม่ได้อยู่ที่ลิงค์ที่คุณอ้างอิงอีกต่อไป อาจใช้กับเวอร์ชันก่อนหน้านี้ได้หรือไม่
Drew Noakes

จริง ๆ แล้วมันใช้กับรหัสที่มีอยู่ทั้งหมดที่คุณต้องทำคือการใช้มิดเดิลแวร์จัดการข้อผิดพลาดเพื่อตรวจจับข้อผิดพลาด Ex: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 วิธีที่ดีที่สุดคือใช้next()ฟังก์ชัน:

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

จากนั้นจัดการข้อผิดพลาดโดยตัวจัดการข้อผิดพลาดของคุณและคุณสามารถจัดรูปแบบข้อผิดพลาดได้ดีโดยใช้ HTML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.