2016-04-25 75 views
5

在app.js,我有如何在express.js中引發404錯誤?

// 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/notfound,上面的代碼將被執行。

在存在的URL像http://localhost/posts/:postId,我想拋出404錯誤時訪問一些不存在postId或刪除postId。

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:

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

或者,如果這聽起來過於重複的代碼,你總是可以扳指碼出到一個函數:

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

我不會推薦在這種情況下使用中間件,因爲我覺得它會讓代碼變得不那麼清晰 - 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中的路由之後。