我希望能更好地理解快递app.get()
和app.use()
之间的区别。
我知道app.use适用于所有HTTP动词。
我还读过“app.use()
adds middleware rather than a route”
我想了解为什么这个事实导致了这种行为......
我有一个需要代理React开发Web服务器的快速API服务器。
这意味着必须代理所有非API路由的路由。
当我代理这样的路线时,它起作用:
var proxy = require('express-http-proxy');
module.exports = function set_react_catchall_routes(app) {
/* Final route to send anything else to react server. */
app.get('*', proxy('localhost:3000'));
app.post('*', proxy('localhost:3000'));
}
但是当我这样做时它不起作用:
app.use('*', proxy('localhost:3000'));
具体来说,“索引”页面被代理并提供,内容如下:
<body>
<div id="root"></div>
<script type="text/javascript" src="/static/js/bundle.js"></script>
</body>
并且客户端请求javascript react bundle,但随后“没有任何反应”。
我有理由相信,当它工作时(GET和POST除外)没有涉及“其他”HTTP请求,因为没有记录。
那会有什么区别?
答案 0 :(得分:2)
尝试将此日志记录置于顶部,这应该有助于澄清发生了什么:
app.use(function(req, res, next) {
// req.path will be '/static/js/bundle.js'
console.log('path1: ' + req.path);
next();
});
app.use('*', function(req, res, next) {
// req.path will be '/'
console.log('path2: ' + req.path);
next();
});
app.all('*', function(req, res, next) {
// req.path will be '/static/js/bundle.js'
console.log('path3: ' + req.path);
next();
});
当您使用app.use
时,它会删除req.path
的匹配部分。如果您没有指定路径(记录部分1),它将不会删除任何内容。同样,第3部分正在使用app.all
(app.get
等,所有工作方式都相同),也不会改变req.path
。它的第2部分是踢球者。
要理解为什么会发生这种情况,请考虑以下示例:
var router = express.Router();
router.get('/profile', ...);
app.use('/user', router);
当/user/profile
的请求进入时,app.use
将剥离路径的/user
部分。就router
而言,路径只是/profile
。
引用文档http://expressjs.com/en/4x/api.html#req.path
从中间件调用时,挂载点不包含在req.path中。
拨打app.use
的路径有点像&#39;以&#39;开头。任何匹配的东西都会丢掉。对于匹配所有内容的*
,它会丢弃所有内容。
如果您快速浏览express-http-proxy
的源代码,您会看到它使用req.path
来确定代理请求的路径。如果你只使用没有路径的app.use
,它应该可以正常工作。
还有一些其他请求属性与理解app.use
:
req.url
与req.path
类似,但包含查询字符串。与req.path
一样,它的部分与mountpath
移除的app.use
匹配。请注意,Express Request
会继承Node url
中的http.IncomingMessage
属性,因此未在Express文档中明确列出。req.originalUrl
与req.url
相同,但不会被app.use
更改。req.baseUrl
用于存储app.use
已删除的路径部分。有关所有这三个属性的详细信息,请参阅the documentation了解req.originalUrl
。