代理中app.use和app.get *之间的区别*

时间:2017-10-26 23:06:20

标签: reactjs express http-proxy

我希望能更好地理解快递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请求,因为没有记录。

那会有什么区别?

1 个答案:

答案 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.allapp.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.urlreq.path类似,但包含查询字符串。与req.path一样,它的部分与mountpath移除的app.use匹配。请注意,Express Request会继承Node url中的http.IncomingMessage属性,因此未在Express文档中明确列出。
  • req.originalUrlreq.url相同,但不会被app.use更改。
  • req.baseUrl用于存储app.use已删除的路径部分。

有关所有这三个属性的详细信息,请参阅the documentation了解req.originalUrl