如何指定HTTP错误代码?


161

我努力了:

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

和:

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

但总是会显示错误代码500。


1
我的回答一个相关的问题可以帮助:stackoverflow.com/questions/10170857/...
Pickels

2
您能否更新已接受的回复?
丹·曼德

Answers:


293

根据Express(版本4+)文档,您可以使用:

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以使用最新版本的API。如果您想发送更多信息,请进行连锁:res.status(400).json({ error: 'message' })
TyMayn 2014年

1
@Mikel如果没有响应变量,则无法发送响应。
Dan Mandle

1
现在已全部弃用,您应该使用res.sendStatus(401);
Cipi

1
这种反应将是一个很大更完整,如果它结束了res.send('Then you shall die')
goodvibration

1
@Cipi您是否有资料来源?该文档未表明.status()已弃用。.sendStatus()是的简写形式,.status(code).send(codeName)其中codeName是给定的标准HTTP响应文本code
詹姆斯·科伊尔

78

一个简单的班轮;

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

20

我想以这种方式集中创建错误响应:

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})
});

所以我总是有相同的错误输出格式。

PS:当然,您可以创建一个对象来扩展标准错误,如下所示:

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);


12

在Express 4.0中,他们做对了:)

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

某些(也许是较旧的?)express版本捆绑的errorHandler中间件版本似乎已对状态代码进行了硬编码。另一方面,此处记录的版本:http : //www.senchalabs.org/connect/errorHandler.html可以让您执行您想做的事情。因此,也许尝试升级到Express / Connect的最新版本。


9

从我在Express 4.0中看到的结果来看,这对我有效。这是身份验证所需中间件的示例。

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

旧问题,但仍会出现在Google上。在当前版本的Express(3.4.0)中,可以在调用next(err)之前更改res.statusCode:

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

下一步做什么?
史蒂夫·K

next正在调用next处理程序,该处理程序通常在express.js中试图呈现错误页面。
Kurotsuki 2015年


2

我试过了

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

..但它给了我错误

(节点:208)UnhandledPromiseRejectionWarning:错误:发送标头后无法设置标头。

这对我有用

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.