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

IT技术 reactjs express http-proxy
2021-05-11 02:46:49

我希望能更好地理解 expressapp.get()app.use().

我了解 app.use 适用于所有 HTTP 动词。

我还读过“app.use()添加中间件而不是路由

我想了解为什么这个事实会导致这种行为......

我有一个需要代理 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 包,但随后“什么也没发生”。

我有理由确信当它工作时没有涉及“其他”HTTP 请求(GET 和 POST 除外),因为没有记录。

那么会有什么不同呢?

1个回答

尝试将此日志记录放在顶部,它应该有助于澄清正在发生的事情:

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 中。

调用 to 的路径app.use有点像“开始于”,任何匹配的东西都会被丢弃。因为*它匹配所有东西,所以它扔掉了所有东西。

如果您快速浏览源代码,express-http-proxy您会发现它用于req.path确定代理请求的路径。如果您只是在app.use没有路径的情况下使用它应该可以正常工作。

还有一些其他请求属性与理解类似app.use

  • req.url类似于req.path但包含查询字符串。就像req.path它将具有与mountpath删除的部分匹配的部分app.use请注意,ExpressRequest继承了urlNode 的属性,http.IncomingMessage因此它没有在 Express 文档中明确列出。
  • req.originalUrl开始时与 相同,req.url但不会被 改变app.use
  • req.baseUrl用于存储已被删除的路径部分app.use

请参阅该文档req.originalUrl在所有这三个属性的更多细节。