2017-02-25 105 views
0

我想向我的Web服務添加一個處理不受支持的URL的選項,我應該提及我正在使用Express。 爲了處理不良網址,(代碼404),我嘗試使用Nodejs處理不受支持的URL和請求類型

app.use(app.router); 

但很顯然它是過時了,我可以用什麼其他解決辦法? 我看到這個suggested solution,但我想先聽聽其他的選擇。

另外,我的web服務支持一些HTTP請求類型,比如GET和POST,如何正確響應我不支持的請求類型?如DELETE。

我想要的行爲是,如果發生404錯誤,我將返回一個適當的響應消息。在不支持請求的情況下也是如此。

例如:

response.status(404).json({success: false,msg: 'Invalid URL'}); 
+0

您應該更具體地說明在404情況下以及在不支持的方法情況下(以及在最後一種情況下,如果這對於任何URL是通用的,或者您需要不同的行爲針對不同的網址)。 – jcaron

+0

@jcaron,我想有兩種行爲。在404的情況下,我將返回一個適當的響應消息。在不支持請求的情況下也是如此。 –

回答

1

一個404處理器在快遞所有未處理的請求通常是這樣的:

app.use(function(req, res, next) { 
    res.status(404).sendFile(localPathToYour404Page); 
}); 

你讓這最後的路線,你註冊,它會得到如果沒有其他路線處理了請求,則調用。

這也會捕獲您不支持的方法,如DELETE。如果你想根據請求來定製響應,那麼你可以在上面的處理程序中放入你想要的任何檢測和定製代碼。

例如,如果你想檢測DELETE請求時,你可以這樣做:

app.use(function(req, res, next) { 
    if (req.method === "DELETE") { 
     res.status(404).sendFile(localPathToYour404DeletePage); 
    } else { 
     res.status(404).sendFile(localPathToYour404Page); 
    } 
}); 

或者,如果你的反應是JSON:

app.use(function(req, res, next) { 
    let obj = {success: false}; 
    if (req.method === "DELETE") { 
     obj.msg = "DELETE method not supported"; 
    } else { 
     obj.msg = "Invalid URL"; 
    } 
    res.status(404).json(obj); 
}); 

一些參考:

Express FAQ: How do I handle 404 responses?

Express Custom Error Pages


而且,當你在這,你或許應該放在一個Express error handler太:

// not that this has four arguments compared to regular middleware that 
// has three arguments 
app.use(function (err, req, res, next) { 
    console.error(err.stack) 
    res.status(500).send('Something broke!') 
}); 

這可以讓你處理任何地方你的中間件遇到了錯誤,並呼籲next(err)的情況下。

+0

謝謝你的詳細回覆,我有一個問題二人,'let obj'是什麼意思?什麼類型的對象被創建? –

+0

'let'是'var'的ES6升級。它聲明瞭一個塊範圍的變量。 'var'聲明一個函數scoped變量。你可以閱讀關於讓[在MDN上](https://developer.mozilla)。組織/ EN-US /文檔/網絡/的JavaScript /參考/語句/ LET)。它創建'var obj = {};'所做的相同類型的對象。許多人認爲'var'應該不再被使用 - 在ES6支持的環境(比如node.js)中的所有聲明都應該使用'let'。在我自己的node.js編碼中,我不再使用'var'。 – jfriend00

+0

Ohh好的,我應該替換'var express = require('express');' 'let express = require('express');' ?或者這不是一個關鍵問題? –

相關問題