问题 在使用中间件的expressjs中的应用程序重定向


我正在尝试制作一个用于处理url别名的中间件,我现在正在做的是:

// [...]
module.exports = function() {

  return function(req, res, next) {
    // getAlias would get an object {alias:"alias/path",source:"/real/path"} or null
    var alias = getAlias(req.url);
    if(alias) {
        req.url = alias.source;
    }
    next();
  };

};

所以我基本上是在商店中查找请求的URL,如果找到它作为别名,我将request.url更改为该别名的源路径,以便express表示调用正确的路径。

问题是request.url和request.path具有相同的值,但是request.url工作时更改request.path不起作用。另外我不确定哪一个我需要再次测试。

当我与request.url交互时,事情有效,但只是想确保我以正确的方式做到这一点。

有什么想法吗 ?


10373
2017-09-29 15:00


起源



答案:


重写 req.url property是内部重新路由请求的正确方法。这就是为什么有一个 req.originalUrl 对于确实更改原始URL的情况。

这是Express文档声明的内容 req.originalUrl

这个属性很像 req.url但它保留了原件   请求网址,允许您重写 req.url 内部自由   路由目的。

req.url 属性没有记录,但从上面的陈述中你可以推断出它的意思是按照你解释的方式使用。它也在某些Express测试中以这种方式使用。


13
2017-09-29 15:31



这似乎不适用于快速迷你路由器内部(使用 express.Router()) - Uday Hiwarale


答案:


重写 req.url property是内部重新路由请求的正确方法。这就是为什么有一个 req.originalUrl 对于确实更改原始URL的情况。

这是Express文档声明的内容 req.originalUrl

这个属性很像 req.url但它保留了原件   请求网址,允许您重写 req.url 内部自由   路由目的。

req.url 属性没有记录,但从上面的陈述中你可以推断出它的意思是按照你解释的方式使用。它也在某些Express测试中以这种方式使用。


13
2017-09-29 15:31



这似乎不适用于快速迷你路由器内部(使用 express.Router()) - Uday Hiwarale


您可以使用 run-middleware 正是为了那个模块。只需使用URL和方法及数据运行所需的处理程序即可。

https://www.npmjs.com/package/run-middleware

例如:

module.exports = function() {

  return function(req, res, next) {
    // getAlias would get an object {alias:"alias/path",source:"/real/path"} or null
    var alias = getAlias(req.url);
    if(alias) {
        res.runMiddleware(alias,(status,data)=>(res.status(status).send(data))
    }
    next();
  };

};

0
2017-09-15 09:24