【发布时间】:2019-08-26 02:48:56
【问题描述】:
我有一个 Express 服务器,我的应用通过 app.get('*') 路由提供服务。
我想让拥有促销代码的用户通过如下的广告系列 URL 访问该网站:www.mysite.com/?code=123。
问题是每个浏览器请求都被路由到 favicon 请求,因此我的 req.url 和 req.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>`)
);
});
})
【问题讨论】:
-
我觉得你应该试试这个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