【问题标题】:Modifying request object in middlewares-Node.JS在中间件-Node.JS 中修改请求对象
【发布时间】:2015-03-09 01:30:59
【问题描述】:

我的 Node.JS 应用程序中有一堆中间件,有什么方法可以删除/修改 req.path 并反映在下一个中间件中?

如果我的问题含糊不清,如果您需要更多说明,请告诉我?

更新:

即使 req.path = 'foo' 在该行之后也不会更改我的 req.path!

req.path = "foo";
console.log(req.path);// Here still it shows my original req.path not foo!

谢谢

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:
    function requestDispatcher() {
      //default version was set to v1
      var defaultVersion = 'v1',
        re = /\/v\d/;
      return function(request, response, next) {
        var version = request.get('version');
        debug(request.url);
        // test if request.url has already contained version number
        if (!re.test(request.url)) {
          // if not define version number in http header then set default version
          // otherwise use the version number in the http header
          if (version === null || version === undefined) {
            request.url = ['/', defaultVersion, request.url].join('');
          } else {
            request.url = ['/', version, request.url].join('');
          }
        }
        debug(request.url);
        next();
      };
    }
    

    我使用这个技巧将请求分派到指定的版本,如果没有指定,则路由到默认版本。这对我有用

    app.use(requestDispatcher());
    app.use('/v1', require('./v1'));
    app.use('/v2', require('./v2'));
    

    【讨论】:

    • 我还没有完全理解你的意思!你看到我更新的问题了吗?您的代码中的debug(request.url); 是什么?它有什么作用?
    • 在 express 中,req.path 是一个只读属性,如果你查看它的源代码 defineGetter(req, 'path', function path() { return parse(this).pathname; });
    • function defineGetter(obj, name, getter) { Object.defineProperty(obj, name, { 可配置: true, enumerable: true, get: getter }); };
    • 也就是说,如果你想改变路径,并反映下一个中间件,使用req.url而不是req.path,并且debug是记录东西的模块,它比控制台更好。日志,写完console.log总会忘记删除
    • 查看我的示例,使用 req.url 而不是 req.path
    【解决方案2】:

    是的,只需将.path 更改为您想要的任何内容。许多官方的中间件和 API,例如挂载,正是这样做的。请注意,如果您不知道自己在做什么,这很容易破坏很多东西!

    【讨论】:

    • 即使 req.path = 'foo' 在该行之后也没有改变我的 req.path!
    【解决方案3】:

    是的。只需删除或修改它。它是一个 javascript 对象。

    【讨论】:

    • 但似乎它并没有反映在下一个中间件中!也许我做错了什么。我应该也使用管道还是只是更改它应该反映在下一个中间件中?
    • 也许 req.path 是一个计算属性?你试过改变 req.url 吗?
    • 看来我犯了一个愚蠢的错误,我刚刚用我在做什么更新了我的问题;似乎在这个操作之后它甚至没有修改req.path,我做错了吗?
    • 这还不足以说明你做错了什么。您应该删除所有代码并尝试设置req.path = 'poop' 看看是否可行,然后从那里开始
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多