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
受け入れられた応答を更新していただけませんか?
Dan Mandle、2015年

回答:


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
APIの最新バージョンを使用するための+1。より多くの情報を送信したい場合は、チェーンしてください:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel応答変数がない場合は、応答を送信できません。
Dan Mandle 2017

1
これは現在すべて非推奨ですres.sendStatus(401);。を使用してください。
Cipi

1
で終わる場合、この応答ははるかに完全になりres.send('Then you shall die')ます。
goodvibration

1
@Cipiそのためのソースはありますか?ドキュメント.status()は非推奨であることを示していません。.sendStatus()以下のためだけの省略形です.status(code).send(codeName)どこcodeName与えられたため、標準のHTTP応答テキストですcode
James Coyle、

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

16

あなたは使用することができますres.send('OMG :(', 404);だけでres.send(404);


しかし、エラーコードをeventHandlerミドルウェアに送信したいので、Expressのカスタムエラーページが表示されます。
tech-man

12
2016年にこれを読んでいる人のために:Express 4.xに従い、res.send(404)は非推奨です。今res.sendStatus(404)です。 expressjs.com/en/api.html#res.sendStatus
0xRm

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

次は何をしますか?
Steve K

next通常、express.jsでエラーページをレンダリングしようとしている次のハンドラを呼び出しています。


2

私は試した

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

..しかし、それは私にエラーを与えていました

(node:208)UnhandledPromiseRejectionWarning:エラー:送信後にヘッダーを設定できません。

この仕事は私にとって

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

0

Boomパッケージを使用して、httpエラーコードの送信を処理することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.