2016-04-25 10 views
5

は、私はいくつかのコードの上に、http://localhost/notfoundのようなURLを存在しない要求した場合に実行されますので、express.jsに404エラーを投げる方法は? app.jsで

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

を持っています。

存在するURLには、http://localhost/posts/:postIdのように、一部のアクセスできないポストIDまたは削除されたポストIDにアクセスすると404エラーが発生します。

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     // How to throw a 404 error, so code can jump to above 404 catch? 
    } 
+0

この 'Posts.findOne'はページリクエスト内で呼び出されますか、ページリクエスト内の約束ですか? –

答えて

3

In Express, a 404 isn't classed as an 'error', so to speak - この背後にある理由は、404は通常、何かが間違っています、それは、サーバが何かを見つけることができなかっただけということだ兆候はないということです。あなたの最善の策は、明示的にルートハンドラで404を送信することです:

function notFound(res) { 
    res.status(404).send("Not found."); 
} 

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
     .then(function(post) { 
     if(!post) { 
      notFound(res); 
     } 

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     res.status(404).send("Not found."); 
    } 

またはその代わりに、これはあまりにも多くの繰り返しのコードのように感じているならば、あなたは常にアウト機能にそのコードを引くことができ

この状況でミドルウェアを使用することは推奨しません。なぜなら、コードをあまり明確にしないと感じるからです.404は、データベースコードが何も見つけられないという直接的な結果であるため、ルートハンドラ。

0

あなたはこれを使用して、ルータの終わりできるような何かを探しています。

app.use('/', my_router); 
.... 
app.use('/', my_router); 

app.use(function(req, res, next) { 
     res.status(404).render('error/404.html'); 
    }); 
2

私は同じapp.js構造を持っている、と私はルートハンドラで、このようにこの問題を解決:

router.get('/something/:postId', function(req, res, next){ 
    // ... 
    if (!post){ 
     next(); 
     return; 
    } 
    res.send('Post exists!'); // display post somehow 
}); 

next()機能があればerror404ハンドラで次のミドルウェアを呼び出しますapp.jsのルート直後です

関連する問題