Làm thế nào để lập trình gửi phản hồi 404 bằng Express / Node?


185

Tôi muốn mô phỏng lỗi 404 trên máy chủ Express / Node của mình. Làm thế nào tôi có thể làm điều đó?


7
"Mô phỏng" khác với "thực tế" như thế nào?
Jon Hanna

Câu trả lời:


273

Ngày nay có một statuschức năng dành riêng cho việc này trên đối tượng phản hồi. Chỉ cần xích nó ở một nơi nào đó trước khi bạn gọi send.

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

7
Điều này cũng hoạt động với các trang được kết xuất:res.status(404).render('error404')
jmu

20
Đáng lưu ý rằng trên chính nó res.status(404);sẽ không gửi phản hồi AFAIK. Nó cần phải được xâu chuỗi với một cái gì đó, ví dụ res.status(404).end();hoặc ví dụ thứ hai của bạn, hoặc nó cần phải được theo sau bởi ví dụ res.end();,res.send('Not found');
UpTheCalet

1
@UpTheCalet, tôi sẽ xóa ví dụ đầu tiên khỏi mã để tránh khả năng gây nhầm lẫn đó.
vẽ Noakes

1
phiên bản ngắn hơnres.sendStatus(404)
bentesha

47

Cập nhật câu trả lời cho Express 4.x

Thay vì sử dụng res.send(404)như trong các phiên bản cũ của Express, phương thức mới là:

res.sendStatus(404);

Express sẽ gửi phản hồi 404 rất cơ bản với văn bản "Không tìm thấy":

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
Tôi khá chắc chắn rằng nó chỉ res.status(404)không res.sendStatus(404).
Jake Wilson

4
res.sendStatus(404)đúng. Nó tương đương vớires.status(404).send()
Justin Johnson

2
Yep res.sendStatus(404); tương đương với res.status(404).send('Not Found')
Rick

@JakeWilson bây giờ là gì ??
blacksheep

43

Bạn không cần phải mô phỏng nó. Đối số thứ hai để res.sendtôi tin là mã trạng thái. Chỉ cần vượt qua 404 để tranh luận.

Hãy để tôi làm rõ rằng: Theo tài liệu trên expressjs.org , dường như bất kỳ số nào được chuyển đến res.send()sẽ được hiểu là mã trạng thái. Vì vậy, về mặt kỹ thuật bạn có thể thoát khỏi:

res.send(404);

Chỉnh sửa: xấu của tôi, tôi có nghĩa là resthay vì req. Nó sẽ được gọi vào phản hồi

Chỉnh sửa: Kể từ Express 4, send(status)phương thức đã không được chấp nhận. Nếu bạn đang sử dụng Express 4 trở lên, hãy sử dụng: res.sendStatus(404)thay vào đó. (Cảm ơn @badcc về mẹo trong các bình luận)


1
Bạn cũng có thể gửi tin nhắn với 404: res.send(404, "Could not find ID "+id)
Pylinux

Gửi mã trạng thái trực tiếp không được chấp nhận trong 4.x và có thể sẽ bị xóa tại một số điểm. Tốt nhất để gắn bó với.status(404).send('Not found')
Matt Fletcher

2
Đối với Express 4: "express deprecated res.send (status): Sử dụng res.sendStatus (status) thay thế"
badcc

10

Theo trang web tôi sẽ đăng bên dưới, đó là tất cả cách bạn thiết lập máy chủ của mình. Một ví dụ họ thể hiện là:

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;

và chức năng tuyến đường của họ:

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;

Đây là một cách. http://www.nodebeginner.org/

Từ một trang web khác, họ tạo một trang và sau đó tải nó. Đây có thể là nhiều hơn những gì bạn đang tìm kiếm.

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

Từ trang Express , xác định ngoại lệ NotFound và ném nó bất cứ khi nào bạn muốn có trang 404 HOẶC chuyển hướng đến / 404 trong trường hợp dưới đây:

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
Mã ví dụ này không còn ở liên kết bạn tham khảo. Điều này có thể áp dụng cho một phiên bản trước của express?
vẽ Noakes

Nó thực sự vẫn còn áp dụng cho mã hiện có, tất cả những gì bạn phải làm là sử dụng phần mềm trung gian xử lý lỗi để bắt lỗi. Vd: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 cách tốt nhất là sử dụng next()chức năng:

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

Sau đó, lỗi được xử lý bởi trình xử lý lỗi của bạn và bạn có thể định kiểu lỗi một cách độc đáo bằng HTML.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.