首页 > 解决方案 > Node Express app.get(*) req.url 总是 /favion.ico

问题描述

我有一个 Express 服务器,我的应用程序是从app.get('*')路由提供的。

我想让有促销代码的用户从这样的活动 URL 访问该网站:www.mysite.com/?code=123.

问题是每个浏览器请求都被路由到 favicon 请求,因此我的req.urlreq.query变量不能用于获取促销代码。Req.url总是/favicon.ico并且req.query总是空的。

我确实发现原始 URL 是请求对象的标头,但这似乎是实现我的目标的迂回方式。请求对象的原始 URL 字段也指向favicon.ico.

app.get('*', (req, res) => {
  console.log(req.url);
  console.log(req.query);
}

我想暂时让我的促销代码解决方案尽可能快速和肮脏,所以我对 URL 参数很好。是否有一个简单的解决方案来提取原始 URL 查询参数而不深入到标题中?

编辑:我现在在下面分享我的根请求处理程序。favicon 请求由代码前面的 express-favicon 中间件处理。

app.get('*', (req, res) => {
  console.log("In get *");
  console.log("Req.url: ",req.url);
  console.log("Promo code: ",req.query.promo);
  const context = {};
    const app = ReactDOMServer.renderToString(
      <StaticRouter location={req.url} context={context}>
        <App />
      </StaticRouter>
    );

  const indexFile = path.resolve('./public/index.html');

  fs.readFile(indexFile, 'utf8', (err, data) => {
      if (err) {
        console.error('Something went wrong:', err);
        return res.status(500).send('Oops, better luck next time!');
      }

      return res.send(
        data.replace('<div id="root"></div>', `<div id="root">${app}</div>`)
      );
    });
})

标签: javascriptnode.jsreactjsexpressserver

解决方案


问题是我正在使用 React Router,它不支持查询参数: https ://reacttraining.com/react-router/web/example/query-parameters

为了解决这个问题,我window.location.search在客户端使用来获取促销代码,然后使用显式促销处理程序传递给后端。


推荐阅读