【问题标题】:Nodejs handle unsupported URLs and request typesNodejs 处理不受支持的 URL 和请求类型
【发布时间】:2017-02-25 21:24:32
【问题描述】:

我想在我的网络服务中添加一个选项来处理不受支持的 URL,我应该提到我正在使用 Express。 为了处理错误的 URL(代码 404),我尝试使用

app.use(app.router);

但显然它已被弃用,我还可以使用哪些其他解决方案? 我看到了这个suggested solution,但我想先了解其他替代方案。

另外,我的网络服务支持一些HTTP请求类型,例如GET和POST,我如何正确响应我不支持的请求类型?比如删除。

我想要的行为是,如果出现 404 错误,我将返回适当的响应消息,仅此而已。在不受支持的请求的情况下也是如此。

例如:

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

【问题讨论】:

  • 您应该更具体地说明在 404 情况下以及在不受支持的方法的情况下要做什么(在最后一种情况下,如果这对于任何 URL 都是通用的,或者如果您想为不同的 URL 提供不同的行为)。
  • @jcaron,我希望两者都有 2 种行为。在 404 的情况下,我将返回一个适当的响应消息,仅此而已。在不受支持的请求的情况下也是如此。

标签: node.js http httprequest


【解决方案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 Custom Error Pages


而且,当您使用它时,您可能也应该输入Express error handler

// note 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) 的情况。

【讨论】:

  • 感谢您的详细回复,我有一个问题,'let obj' 是什么意思?创建什么类型的对象?
  • letvar 的 ES6 升级。它声明了一个块范围的变量。 var 声明了一个函数作用域变量。您可以阅读有关 let here on MDN 的信息。它创建与var obj = {}; 相同类型的对象。许多人认为不应再使用var - 支持 ES6 的环境(如 node.js)中的所有声明都应使用 let。在我个人的node.js编码中,我不再使用var
  • 哦,好吧,我应该替换 'var express = require('express');'用'让快递=要求('快递');' ?或者这不是一个关键问题?
  • @DavidFaiz - 这不是一个关键问题。我可能会使用const express = require('express'); const 就像let,但不允许在声明中分配变量。有关详细说明,请参阅const on MDN
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多