javascript - Express 中间件中对 request.url 的更改是否会持续到下一个中​​间件?

标签 javascript node.js express

我有一个重写 request.url 的中间件。但是在next()中间件中,request.url还是原来未修改的url。

例子:

var express = require('express');
var router = express.Router();

router.use(function(req, res, next) {
  console.log('Before Rewrite',req.url);
  if(/^\/v[1-9]/.test(req.originalUrl) ) {
    console.log('Rewritten');
    req.url = '/api' + req.originalUrl;
  }
  console.log('After Rewrite',req.url);
  next();
});
router.use('/api', function(req, res, next) {
  console.log('Next', req.url);
  next();
});

使用 '/v3/foo' 的示例 url,以下输出到控制台:

Before Rewrite /v3/foo
Rewritten
After Rewrite /api/v3/foo
Next /v3/foo

关于为什么请求更改不会持续到下一个中​​间件有什么想法吗?

最佳答案

感谢@kelz 到 Express next() code 的链接,我对 Express 如何处理 url 有了更好的理解。看起来 req.url 是可写的,因为 Express 在匹配时删除了 url 的根。例如,原始 url 为“/foo/bar”,如果您有:

router.use('/foo', someMiddleWare);

然后 someMiddleWare 中的 req.url 现在将是“/bar”,即删除匹配的根。这就是为什么我们有 req.originalUrl(不可写)来保留未更改的 url。

由于我原来重写 url 的方法行不通,我选择了一个更简单的解决方案:

  router.all(/^\/v[1-9]/, function(req, res) { res.redirect('/api' + req.originalUrl); });

这样,在重定向之后,req.originalUrl 就应该是我后来的中间件。

关于javascript - Express 中间件中对 request.url 的更改是否会持续到下一个中​​间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596780/

相关文章:

mysql - 仅启用 createdAt 时间戳并忽略 Sequelize 中的 updatedAt 时间戳

javascript - Redux 表单和同构获取总是向服务器提交空白表单

javascript - 即使在启用 express CORS 中间件后,axios 请求上的 Access-Control-Allow-Origin 错误

javascript - 是否有需要 getAttributeNode 和/或 getAttributeNodeNS 的实际用例?

node.js - 如何摆脱错误 : "OverwriteModelError: Cannot overwrite ` undefined` model once compiled. “?

javascript - Node.js 和 SQL 检查数据库的结果

javascript - 如何关闭 Node 中的无界和管道流请求?

javascript - sharedModules 到多个完全不同的应用程序

javascript - 如何将字符串发送到服务器以区分它

javascript - 使用 Google Closure 编译器时在浏览器和 node.js 之间共享 JS 的最佳方式