プログラムでExpress / Nodeを使用して404応答を送信する方法は?


185

Express / Nodeサーバーで404エラーをシミュレートしたい。どうやってやるの?


7
「シミュレートされた」と「実際の」シミュレーションはどのように異なりますか?
Jon Hanna

回答:


273

今日では、応答オブジェクトにこれ専用のstatus関数があります。呼び出す前に、どこかにそれをチェーンしてくださいsend

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');

7
これはまた、レンダリングされたページで動作します:res.status(404).render('error404')
JMU

20
res.status(404);それ自体ではAFAIK応答を送信しないことに注意してください。それは何か、などを連鎖させることのいずれかに必要res.status(404).end();か、あなたの第二の例、またはそれは例えば続いする必要がありres.end();res.send('Not found');
UpTheCreek

1
@UpTheCreek、コードから最初の例を削除して、混乱の可能性を回避します。
Drew Noakes 2014年

1
短縮版res.sendStatus(404)
ベンテシャ

47

Express 4.xの回答の更新

res.send(404)古いバージョンのExpressのように使用するのではなく、新しい方法は次のとおりです。

res.sendStatus(404);

Expressは、「見つかりません」というテキストを含む非常に基本的な404応答を送信します。

HTTP/1.1 404 Not Found
X-Powered-By: Express
Vary: Origin
Content-Type: text/plain; charset=utf-8
Content-Length: 9
ETag: W/"9-nR6tc+Z4+i9RpwqTOwvwFw"
Date: Fri, 23 Oct 2015 20:08:19 GMT
Connection: keep-alive

Not Found

1
私はそれがただでres.status(404)はないと確信していres.sendStatus(404)ます。
Jake Wilson

4
res.sendStatus(404)正しい。これは次と同等ですres.status(404).send()
ジャスティンジョンソン

2
うんres.sendStatus(404); はに相当 res.status(404).send('Not Found')
Rick

@JakeWilson今それは何ですか?
ブラックシープ

43

シミュレーションする必要はありません。res.send私の2番目の引数はステータスコードです。その引数に404を渡すだけです。

それを明確にしましょう:expressjs.orgのドキュメントによると、渡された数値res.send()はステータスコードとして解釈されるようです。したがって、技術的には、次のことを回避できます。

res.send(404);

編集:私の悪い、私はのres代わりに意味しましたreq。応答時に呼び出す必要があります

編集: Express 4以降、このsend(status)メソッドは廃止されました。Express 4以降を使用している場合は、res.sendStatus(404)代わりに:を使用してください。(コメントのヒントについては@badccに感謝します)


1
また、404でメッセージを送ることができます: res.send(404, "Could not find ID "+id)
Pylinux

ステータスコードを直接送信することは、4.xで廃止され、おそらくいずれかの時点で削除されるでしょう。固執するのに最適.status(404).send('Not found')
Matt Fletcher

2
Express 4の場合:「非推奨のres.send(status)を表現:代わりにres.sendStatus(status)を使用してください」
badcc

10

以下に掲載するサイトによると、これがサーバーの設定方法です。彼らが示す1つの例はこれです:

var http = require("http");
var url = require("url");

function start(route, handle) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(handle, pathname, response);
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

そしてそれらのルート関数:

function route(handle, pathname, response) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response);
  } else {
    console.log("No request handler found for " + pathname);
    response.writeHead(404, {"Content-Type": "text/plain"});
    response.write("404 Not found");
    response.end();
  }
}

exports.route = route;

これは片道です。 http://www.nodebeginner.org/

別のサイトから、彼らはページを作成し、それをロードします。これはあなたが探しているものの多くかもしれません。

fs.readFile('www/404.html', function(error2, data) {
            response.writeHead(404, {'content-type': 'text/html'});
            response.end(data);
        });

http://blog.poweredbyalt.net/?p=81


9

Expressサイトから、NotFound例外を定義し、404ページを作成するか、以下のケースでは/ 404にリダイレクトしたい場合はいつでも例外をスローします。

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){
  throw new NotFound;
});

app.get('/500', function(req, res){
  throw new Error('keyboard cat!');
});

1
このサンプルコードは、参照しているリンクにはありません。これは、Expressの以前のバージョンに適用されますか?
Drew Noakes 2013年

それは実際には既存のコードに適用され、エラーハンドルミドルウェアを使用してエラーをキャッチするだけです。例:app.use(function(err, res, res, next) { if (err.message.indexOf('NotFound') !== -1) { res.status(400).send('Not found dude'); }; /* else .. etc */ });
alessioalex 2013年

0

IMOの最も良い方法は、next()関数を使用することです。

router.get('/', function(req, res, next) {
    var err = new Error('Not found');
    err.status = 404;
    return next(err);
}

次に、エラーはエラーハンドラーによって処理され、HTMLを使用してエラーのスタイルを適切に設定できます。

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