【问题标题】:Modifying Express.js Request Object修改 Express.js 请求对象
【发布时间】:2012-09-20 17:55:28
【问题描述】:

在 express.js 中,我想为我的每个 URI 侦听器的请求对象提供一个附加属性。这将提供协议、主机名和端口号。例如:

app.get('/users/:id', function(req, res) {
  console.log(req.root); // https://12.34.56.78:1324/
});

我当然可以连接 req.protocol、req.host,并以某种方式传递每个 URI 侦听器的端口号(似乎从 req 对象中丢失),但我希望能够以他们所有人都可以访问此信息的方式进行。

此外,主机名可能因请求而异(机器有多个接口),所以我不能在应用程序启动时连接这个字符串。

目标是向消费者提供指向此 API 中更多资源的 URI。

是否有某种方法可以告诉 Express 我希望 req 对象具有这些附加信息?有没有比我所概述的更好的方法来做到这一点?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    您可以添加一个自定义中间件,为每个请求设置属性:

    app.use(function (req, res, next) {
        req.root = req.protocol + '://' + req.get('host') + '/';
        next();
    });
    

    使用req.get 获取Host 标头,如果需要,该标头应包含端口。

    请务必在之前添加:

    app.use(app.router);
    

    【讨论】:

    • @AdamPietrasiak 如果您有多个域(例如 'your-app.com'、'your-app.com.ar' 和 'your-app.com. br'),需要检查每个请求的域。
    • app.router 顺便说一句已弃用
    【解决方案2】:

    您可以扩展express.request 原型。

    【讨论】:

    • like require("express").request.prototype.foo = function(){} ?
    • Extend express.request 只是在这种情况下不适用,除非出于某种原因 https 在他的根属性上永远不会改变,否则您需要使用中间件并获取 req.protocol... 无论如何,如果你想扩展请求(这实际上就是我发现这个问题的原因)只需使用 express.request.getFooParam = function () { return this.param('foo'); }
    • 正是我想要的。登录给个赞,不用中间件就可以去root扩展原型了。
    【解决方案3】:

    修改请求对象最好的方法是在app.router声明前添加自己的中间件函数。

        app.use(function(req, res, next){
          // Edit request object here
          req.root = 'Whatever I want';
          next();
        });
        app.use(app.router);
    

    这将修改请求对象,并且每个路由都将能够访问 req.root 属性,所以

        app.get('/',function(req, res, next){
          console.log(req.root); // will print "Whatever I want";
        });
    

    【讨论】:

      【解决方案4】:

      您可以使用中间件。将此添加到您的 app.configure 块中:

      app.use(function (req, res, next) {
        req.root = 'WHAT YOU WANT';
        next();
      });
      

      由于next(),每个请求都会执行此功能,然后转到正确的 url-block。

      【讨论】:

        【解决方案5】:

        Express 旨在在响应对象中支持这一点,而不是在请求中。响应对象支持res.locals 中的自定义变量。见http://expressjs.com/en/4x/api.html#res.locals

        这对打字稿用户特别有用。 locals 属性的类型为 Record<string, any>

        【讨论】:

        • 这与问题无关。我们正在寻找修改请求对象的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 2013-05-01
        相关资源
        最近更新 更多