Як вказати код помилки 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
Чи можете ви оновити прийняту відповідь?
Ден Мандл

Відповіді:


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

1
@Mikel, якщо у вас немає змінної відповіді, ви не можете надіслати відповідь.
Ден Мандл

1
Зараз це все застаріло, ви повинні використовувати res.sendStatus(401);.
Cipi

1
Ця відповідь була б набагато повнішою, якби вона закінчилася res.send('Then you shall die').
goodvibration

1
@Cipi У вас є джерело для цього? Документація не вказує .status(), що застаріла. .sendStatus()це лише скорочення, .status(code).send(codeName)де codeNameстандартний текст відповіді HTTP для даного тексту code.
Джеймс Койл


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

16

Можна використовувати res.send('OMG :(', 404);простоres.send(404);


Але я хочу, щоб код помилки був надісланий на проміжне програмне забезпечення eventHandler, щоб відобразилася спеціальна сторінка помилки Express.
техно-людина

12
Для тих, хто читає це у 2016 році: Відповідно до Express 4.x, res.send(404)застарілий. Це зараз res.sendStatus(404). expressjs.com/uk/api.html#res.sendStatus
0xRm

12

У експресі 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

У версії проміжного програмного забезпечення errorHandler у комплекті з деякою (можливо, старшою?) Версією Express, схоже, є код статусу. Тут задокументована версія: 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) ви можете змінити res.statusCode перед викликом наступного (помилка):

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

Що робити далі?
Стів К

nextвикликає наступний обробник, який у express.js зазвичай намагається надати сторінки помилок.
Куроцукі


2

я намагався

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

..але вона давала мені помилку :

(вузол: 208) UnhandledPromiseRejectionWarning: Помилка: Неможливо встановити заголовки після їх надсилання.

Ця робота для мене

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

0

Я рекомендую обробляти надсилання http-кодів помилок за допомогою пакету Boom .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.