好吧,大家都知道200可以,404找不到。但是,对于永久重定向与临时重定向、需要付款或其他更奇特的HTTP错误代码等情况,最好做以下操作:
response.status('REQUEST_ENTITY_TOO_LARGE');
而不是仅仅使用一个魔术数字,这通常被认为是不好的做法。当然,我可以在某个对象中有413:'REQUEST_ENTITY_TOO_LARGE',但Express已经有了状态代码->名称映射的副本,我不想重复它。
如何在ExpressJS中按名称指定响应状态?
编辑:感谢@Akshat指出http。STATUS_CODES。详细阐述他的答案,因为价值观本身是独一无二的,所以可以运行:
var statusCodeByName = {};
for ( var number in http.STATUS_CODES ) {
statusCodeByName[http.STATUS_CODES[number]] = number
}
允许:
> statusCodeByName['Request Entity Too Large']
'413'
有一个Node模块正用于此目的:http状态代码。
https://www.npmjs.org/package/http-status-codes
文件上写着:
安装
npm install http-status-codes
用法
var HttpStatus = require('http-status-codes');
response.send(HttpStatus.OK);
response.send(
HttpStatus.INTERNAL_SERVER_ERROR,
{ error: HttpStatus.getStatusText(HttpStatus.INTERNAL_SERVER_ERROR) }
);
HTTP响应代码不是幻数;它们就是规范。描述性文本只是一个有用的提醒,但协议本身依赖于这些状态代码,而核心代码非常值得学习。两个想法。您当然可以在文件顶部创建一个常量,并执行以下操作:
var REQUEST_ENTITY_TOO_LARGE = 413;
response.status(REQUEST_ENTITY_TOO_LARGE);
然而,大多数RESTAPI只实现以下响应:
200 - OK
201 - Created # Response to successful POST or PUT
302 - Found # Temporary redirect such as to /login
303 - See Other # Redirect back to page after successful login
304 - Not Modified
400 - Bad Request
401 - Unauthorized # Not logged in
403 - Forbidden # Accessing another user's resource
404 - Not Found
500 - Internal Server Error
最后,如果有用的话,我将分享我们用于呈现自定义错误页面的代码:
module.exports = function(app) {
app.use(function(req, res) {
// curl https://localhost:4000/notfound -vk
// curl https://localhost:4000/notfound -vkH "Accept: application/json"
res.status(404);
if (req.accepts('html')) {
res.render('error/404', { title:'404: Page not found', error: '404: Page not found', url: req.url });
return;
}
if (req.accepts('json')) {
res.send({ title: '404: Page not found', error: '404: Page not found', url: req.url });
}
});
app.use( function(err, req, res, next) {
// curl https://localhost:4000/error/403 -vk
// curl https://localhost:4000/error/403 -vkH "Accept: application/json"
var statusCode = err.status || 500;
var statusText = '';
var errorDetail = (process.env.NODE_ENV === 'production') ? 'Sorry about this error' : err.stack;
switch (statusCode) {
case 400:
statusText = 'Bad Request';
break;
case 401:
statusText = 'Unauthorized';
break;
case 403:
statusText = 'Forbidden';
break;
case 500:
statusText = 'Internal Server Error';
break;
}
res.status(statusCode);
if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
console.log(errorDetail);
}
if (req.accepts('html')) {
res.render('error/500', { title: statusCode + ': ' + statusText, error: errorDetail, url: req.url });
return;
}
if (req.accepts('json')) {
res.send({ title: statusCode + ': ' + statusText, error: errorDetail, url: req.url });
}
});
};
除非您愿意自己更改源代码,否则这是不可能的。看看res.send
的实现
如果您提供一个字符串作为参数,它只会将其解释为html,并将响应发送为200。
我认为express使用数字作为HTTP状态代码的原因是因为节点本身使用数字作为HTTP的对象键。STATUS_CODES