使用中间件在ExpressJS中进行应用内重定向

11

我正在尝试制作一个处理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.path不起作用,而request.url起作用。此外,我不确定我必须针对哪一个进行测试。

当我与request.url交互时,事情就会起作用,但只是想确保我正在以正确的方式进行操作。

有什么想法吗?

2个回答

13
重新编写 req.url 属性是内部重定向请求的正确方式。这就是为什么会有一个 req.originalUrl,用于更改原始 URL 的情况。
这是 Express 文档中关于 req.originalUrl 的说明:

此属性很像 req.url,但它保留了原始请求的 URL,使您可以自由地重写 req.url 以进行内部路由。

req.url 属性没有记录在文档中,但从上面的陈述中可以推断出它应该被用于你所解释的方式。在一些 Express 测试中也是这样使用的。

1
似乎在 Express 小型路由器内部(使用 express.Router())无法正常工作。 - Uday Hiwarale

0
你可以使用 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();
  };

};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接