Ответ 1
В документах Express (Version 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');
Я пробовал:
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.
В документах Express (Version 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');
Простой один вкладыш;
res.status(404).send("Oh uh, something went wrong");
Вы можете использовать res.send('OMG :(', 404);
только res.send(404);
Я хотел бы централизовать создание ответа об ошибке следующим образом:
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);
Версия промежуточного программного обеспечения errorHandler, поставляемого с некоторыми (возможно, более старыми?) версиями express, похоже, имеет код состояния hardcoded. Версия, описанная здесь: http://www.senchalabs.org/connect/errorHandler.html, с другой стороны, позволяет делать то, что вы пытаетесь сделать. Поэтому, возможно, попробуйте обновить до последней версии express/connect.
В 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')
Старый вопрос, но все-таки на Google. В текущей версии Express (3.4.0) вы можете изменить res.statusCode перед вызовом следующего (err):
res.statusCode = 404;
next(new Error('File not found'));
Из того, что я видел в 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);
}
выразить устаревшее res.send(тело, статус). Вместо этого используйте res.status(status).send(body)
Я пытался
res.status(400);
res.send('message');
..но это дало мне ошибку:
(узел: 208) UnhandledPromiseRejectionWarning: Ошибка: невозможно установить заголовки после того, как они отправлены.
Эта работа для меня
res.status(400).send(yourMessage);
Я бы порекомендовал обработать отправку кодов ошибок http с помощью пакета Boom.