Express中间件中对request.url的更改是否持续到下一个中间件
Do changes to request.url in Express middleware persist on to the next middleware?
我有一个重写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
相关文章:
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- Redux中间件在next()之前更改状态
- 快速的套接字 io 实例/中间件
- 如何使用Express'正确加载图像;s的静态中间件
- 如何在快递中制作中间件的动态链.js
- 在 Redux 中,在商店中应用中间件未正确称为化简器
- 意思是.JS中间件中的猫鼬填充不起作用
- "Cookies的这个实例“;在nodejs cookie中间件的源代码中
- Expressjs:如何跨路由共享路由中间件
- 如何在Keystone.js项目中使用Express.js中间件
- Express.js恶意路径中间件错误403
- 编写中间件'它不知道它在堆栈上的位置
- Router.use()需要中间件函数,但得到了一个未定义的函数
- webpack-dev中间件,如何在HMR失败时自动卸载
- 快速 - 路由中间件 如何确定响应视图是否已呈现
- 我是否需要在我的中间件中使用“next”或“store.dispatch”
- Express中间件中对request.url的更改是否持续到下一个中间件
- 为什么上面写着'next'在redux中间件代码中没有定义.中间件的next方法是否已弃用
- react redux中动作函数的目的是什么?它们是否都返回一个动作或函数,然后转到存储/中间件