我想在我的网络服务中添加处理不支持的网址的选项,我应该提一下我正在使用Express。 为了处理错误的URL(代码404),我尝试使用
app.use(app.router);
但显然它已被弃用,我可以使用哪些其他解决方案? 我看到了suggested solution,但我想先了解其他替代方案。
此外,我的网络服务支持一些HTTP请求类型,例如GET和POST,如何正确响应我不支持的请求类型?例如DELETE。
我想要的行为是,如果出现404错误,我将返回一个恰当的响应消息。如果请求不受支持,则相同。
例如:
response.status(404).json({success: false,msg: 'Invalid URL'});
答案 0 :(得分:1)
Express中所有未处理请求的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 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)
的情况。