我有一个重写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'的示例网址以下内容输出到控制台:
Before Rewrite /v3/foo
Rewritten
After Rewrite /api/v3/foo
Next /v3/foo
关于请求更改原因的任何想法都不会持续到下一个中间件?
答案 0 :(得分:0)
感谢@kelz到Express next()code的链接,我对Express如何处理网址有了更好的理解。似乎req.url是可写的,因为Express在匹配时删除了url的根。例如,使用' / foo / bar'的原始网址,如果您有:
router.use(' / foo',someMiddleWare);
然后在someMiddleWare中的req.url现在将是' / bar'即删除匹配的根。这就是为什么我们有req.originalUrl(不可写)来保持未更改的URL。
由于我原来重写网址的方法不起作用,我选择了一个更简单的解决方案:
router.all(/^\/v[1-9]/, function(req, res) { res.redirect('/api' + req.originalUrl); });
这样,在重定向之后,req.originalUrl就像我以后的中间件一样。
答案 1 :(得分:-1)
您不在两个功能中共享同一个对象。在中间件函数中更改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