【问题标题】:Node Express app.get(*) req.url is always /favion.icoNode Express app.get(*) req.url 总是 /favicon.ico
【发布时间】:2019-08-26 02:48:56
【问题描述】:

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

我想让拥有促销代码的用户通过如下的广告系列 URL 访问该网站:www.mysite.com/?code=123

问题是每个浏览器请求都被路由到 favicon 请求,因此我的 req.urlreq.query 变量不能用于获取促销代码。 Req.url 始终为 /favicon.icoreq.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>`)
      );
    });
})

【问题讨论】:

  • 我觉得你应该试试这个stackoverflow.com/a/35408810/4518930
  • @AdilLiaqat 没用。 app.get('/favicon.ico',(req,res)=>{ console.log("In get /favicon"); res.sendStatus(204); }); app.get('*', (req, res) => { console.log("In get *"); ...//serve the React app }) 只有来自 get /favicon 的日志被打印。奇怪的是,该应用程序是从 get * 提供的,因此它必须以某种方式执行。但是控制台日志必须重定向到别处。
  • 还有……这条明显拦截一切的神奇网站图标路线在哪里?您确定对促销页面的点击不会同时导致对网站图标和促销页面的请求吗?因为...这就是浏览器通常的工作方式。
  • @KevinB 我尝试过使用显式的 favicon 请求处理程序和处理请求的中间件。在这两种情况下,都会返回 favicon,提供 Web 应用程序,但根 get 请求中的 req.query URL 为空。

标签: javascript node.js reactjs express server


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以在 express 中接受动态值作为 URL 的一部分

    api 调用 ==> www.mysite.com/dynamic_promo_code

    app.get('/:promo_code',(req,res)=>{
    // req.params will be and object holding your dynamic promo_code
    const promo = req.params.promo_code; // this will be your dynamic promo code
    });
    

    如果您希望您的促销代码是可选的并且不想成为 URL 的一部分

    api 调用 ==> www.mysite.com?promocode=dynamic_promo_code

    app.get('/',(req,res)=>{
      //req.query is an object holding your optional parameter
      const code = req.query.promocode; // this will be yor dynamic promo code
    })
    

    【讨论】:

    • 这或多或少是我现在正在做的事情。问题是网站图标请求劫持了调用,然后使用用户在标头中输入的 URL 重新路由到预期的 URL。我将尝试用中间件解决这个问题。
    • 您可以将您的网站图标路线放在这些路线上方。或者您可以分享您的代码以便我提供帮助
    • 谢谢。我将在上面分享我的代码。我已经将 favicon 路线放在这些上面。 facvicon 路由被调用,然后请求被转发到根调用,原始 URL 被屏蔽。我现在正在使用中间件来处理网站图标,但同样的事情正在发生。
    • 您的整个代码请附上网站图标和促销代码
    • 使用 app.get(*) 有什么特别的原因吗? * 基本上用于通配符条目,因此它也将用于 favicon。因此为每个请求保留单独的处理程序将起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2018-08-04
    相关资源
    最近更新 更多