Экспресс.JS: как установить статус ответа по имени, а не по номеру?
хорошо, все знают, что 200 в порядке, а 404 не найден. Но я для таких вещей, как постоянное или временное перенаправление, или требуемая оплата, или другие более экзотические коды ошибок HTTP, может быть лучше сделать что-то вроде:
response.status('REQUEST_ENTITY_TOO_LARGE');
вместо того, чтобы просто использовать магическое число, которое обычно считается плохой практикой. Я мог бы, конечно, иметь 413: 'REQUEST_ENTITY_TOO_LARGE' в каком-то объекте, но у Express уже есть копия кода состояния -> сопоставления имен, и я бы предпочел не дублировать что.
как я могу указать статус ответа по имени в Express JS?
редактировать: спасибо @Akshat за указание http.КОД СОСТОЯНИЯ. Развивая его ответ, так как значения сами по себе уникальны, можно запустить:
var statusCodeByName = {};
for ( var number in http.STATUS_CODES ) {
statusCodeByName[http.STATUS_CODES[number]] = number
}
что позволяет:
> statusCodeByName['Request Entity Too Large']
'413'
3 ответов
для этой цели есть модуль узла: http-status-codes.
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);
однако большинство API REST просто реализуют следующие ответы:
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
наконец, если это полезно, я поделюсь нашим кодом для рендеринга custom страницы ошибок:
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 });
}
});
};
Это невозможно, если вы не хотите изменить исходный код самостоятельно. Взгляните на реализация of res.send
Если вы предоставляете строку в качестве аргумента, она просто интерпретирует ее как html и отправляет ответ как 200.
Я думаю, что причина, по которой express использует номера для кодов состояния HTTP, заключается в том, что сам узел использует номера в качестве объектных ключей для протоколу HTTP.STATUS_CODES