Express中间件中对request.url的更改是否持续到下一个中间件

Do changes to request.url in Express middleware persist on to the next middleware?

本文关键字:中间件 是否 下一个 request url Express      更新时间:2023-09-26

我有一个重写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到Expressnext()代码的链接,我对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就和我以后的中间件一样了。

您在两个函数中没有共享同一个对象。当您更改中间件函数中req的值时,作用域仅绑定在该函数内部。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

示例:

function doAThing(a) {
  a = 5;
  return;
}
var n = 4;
doAThing(n);
console.log(n); // 4