Geo*_*ord 5 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();
});
Run Code Online (Sandbox Code Playgroud)
使用 '/v3/foo' 的示例 url,以下内容将输出到控制台:
Before Rewrite /v3/foo
Rewritten
After Rewrite /api/v3/foo
Next /v3/foo
Run Code Online (Sandbox Code Playgroud)
关于为什么请求更改不会持续到下一个中间件的任何想法?
感谢 @kelz 到 Express next()代码的链接,我对 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); });
Run Code Online (Sandbox Code Playgroud)
这样,在重定向之后,req.originalUrl 就适合我以后的中间件了。
| 归档时间: |
|
| 查看次数: |
3419 次 |
| 最近记录: |