Làm cách nào để xác định mã lỗi HTTP?


161

Tôi đã thử:

app.get('/', function(req, res, next) {
    var e = new Error('error message');
    e.status = 400;
    next(e);
});

và:

app.get('/', function(req, res, next) {
    res.statusCode = 400;
    var e = new Error('error message');
    next(e);
});

nhưng luôn luôn có một mã lỗi 500 được công bố.


1
Câu trả lời của tôi cho một câu hỏi liên quan có thể giúp: stackoverflow.com/questions/10170857/ trên
Pickels

2
Bạn có thể vui lòng cập nhật các phản hồi được chấp nhận?
Dan Mandle

Câu trả lời:


293

Theo tài liệu Express (Phiên bản 4+), bạn có thể sử dụng:

res.status(400);
res.send('None shall pass');

http://expressjs.com/4x/api.html#res.status

<= 3,8

res.statusCode = 401;
res.send('None shall pass');

37
+1 để sử dụng phiên bản API mới nhất. Nếu bạn muốn gửi thêm dây, chỉ cần xâu chuỗi:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel nếu bạn không có biến phản hồi thì bạn không thể gửi phản hồi.
Dan Mandle

1
Đây là tất cả không dùng nữa, bạn nên sử dụng res.sendStatus(401);.
Cipi

1
Phản hồi này sẽ hoàn thiện hơn rất nhiều nếu kết thúc bằng res.send('Then you shall die').
chỉnh

1
@Cipi Bạn có nguồn nào cho việc đó không? Các tài liệu không chỉ ra .status()là không dùng nữa. .sendStatus()chỉ là một viết tắt cho .status(code).send(codeName)nơi codeNamelà nội dung trả lời HTTP tiêu chuẩn cho trao code.
James Coyle

78

Một lót đơn giản;

res.status(404).send("Oh uh, something went wrong");

20

Tôi muốn tập trung vào việc tạo phản hồi lỗi theo cách này:

app.get('/test', function(req, res){
  throw {status: 500, message: 'detailed message'};
});

app.use(function (err, req, res, next) {
  res.status(err.status || 500).json({status: err.status, message: err.message})
});

Vì vậy, tôi luôn luôn có cùng định dạng đầu ra lỗi.

PS: tất nhiên bạn có thể tạo một đối tượng để mở rộng lỗi tiêu chuẩn như thế này:

const AppError = require('./lib/app-error');
app.get('/test', function(req, res){
  throw new AppError('Detail Message', 500)
});

'use strict';

module.exports = function AppError(message, httpStatus) {
  Error.captureStackTrace(this, this.constructor);
  this.name = this.constructor.name;
  this.message = message;
  this.status = httpStatus;
};

require('util').inherits(module.exports, Error);

16

Bạn có thể sử dụng res.send('OMG :(', 404);chỉres.send(404);


Nhưng tôi muốn mã lỗi được gửi đến phần mềm trung gian eventHandler, vì vậy trang lỗi tùy chỉnh của express được hiển thị.
người đàn ông công nghệ

12
Đối với bất cứ ai đọc sách này vào năm 2016: Theo Express 4.x, res.send(404)bị phản đối. Bây giờ là bây giờ res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm

12

Trong Express 4.0 họ đã hiểu đúng :)

res.sendStatus(statusCode)
// Sets the response HTTP status code to statusCode and send its string representation as the response body.

res.sendStatus(200); // equivalent to res.status(200).send('OK')
res.sendStatus(403); // equivalent to res.status(403).send('Forbidden')
res.sendStatus(404); // equivalent to res.status(404).send('Not Found')
res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')

//If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.

res.sendStatus(2000); // equivalent to res.status(2000).send('2000')

11

Phiên bản của phần mềm trung gian errorHandler đi kèm với một số phiên bản (có lẽ cũ hơn?) Của express dường như có mã trạng thái được mã hóa cứng. Phiên bản được ghi lại ở đây: http://www.senchalabs.org/connect/errorHandler.html mặt khác cho phép bạn làm những gì bạn đang cố gắng làm. Vì vậy, có lẽ đang cố nâng cấp lên phiên bản mới nhất của express / kết nối.


9

Từ những gì tôi thấy trong Express 4.0, điều này làm việc cho tôi. Đây là ví dụ về xác thực yêu cầu phần mềm trung gian.

function apiDemandLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on
    console.log('isAuth', req.isAuthenticated(), req.user);
    if (req.isAuthenticated())
        return next();

    // If not return 401 response which means unauthroized.
    var err = new Error();
    err.status = 401;
    next(err);
}

8

Câu hỏi cũ, nhưng vẫn xuất hiện trên Google. Trong phiên bản hiện tại của Express (3.4.0), bạn có thể thay đổi res.statusCode trước khi gọi tiếp theo (err):

res.statusCode = 404;
next(new Error('File not found'));

Làm gì tiếp theo?
Steve K

nextđang gọi trình xử lý tiếp theo mà trong express.js thường đang cố kết xuất các trang lỗi.
Kurotsuki

2

thể hiện không tán thành res.send (cơ thể, trạng thái). Sử dụng res.status (trạng thái) .send (cơ thể) thay thế


2

Tôi đã thử

res.status(400);
res.send('message');

..nhưng nó đã cho tôi lỗi :

(nút: 208) UnhandledPromiseRejectionWarning: Lỗi: Không thể đặt tiêu đề sau khi chúng được gửi.

Công việc này đối với tôi

res.status(400).send(yourMessage);

0

Tôi sẽ khuyên bạn nên xử lý việc gửi mã lỗi http bằng cách sử dụng gói Boom .

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.