javascript - Node Express app.get(*) req.url 总是 /favion.ico
问题描述
我有一个 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>`)
);
});
})
解决方案
问题是我正在使用 React Router,它不支持查询参数: https ://reacttraining.com/react-router/web/example/query-parameters
为了解决这个问题,我window.location.search
在客户端使用来获取促销代码,然后使用显式促销处理程序传递给后端。
推荐阅读
- javascript - 无法在刷新时设置 scrollTo
- hibernate - 带有 SQLNative 和 CustomeType 的 Hibernate 5.2.18 问题
- c# - 分组项目数据表
- tensorflow - 未捕获(承诺中)错误:收到 30 个张量的数组,但预期 1 与输入键dense_Dense1_input 匹配
- flutter - 左行的扩展列高取决于右行的列高
- html - 如何连接 HTML 和 CSS 并在浏览器中签入
- javascript - 当单独显式绑定似乎保证回调的 this 上下文不能被覆盖时,硬绑定的目的是什么?
- sonarqube - 使用一个 sonarqube 项目对不同微服务解决方案进行 SonarQube 分析
- terraform - 根据逻辑参数选择 AMI
- html - 反应JS | 如何将我的侧边栏设置为始终在前面'