Javascript Node Express app.get(*)req.url始终为/favion.ico
我有一个Express服务器,我的应用程序通过该应用程序提供服务。获取“*”路由 我希望具有促销代码的用户可以从活动URL访问该网站,如:www.mysite.com/?code=123 问题是每个浏览器请求都被路由到favicon请求,因此我的req.url和req.query变量不能用于获取促销代码。Req.url始终为/favicon.ico,Req.query始终为空 我确实发现原始URL是请求对象的头,但这似乎是实现我目标的一种迂回方式。请求对象的原始URL字段也指向favicon.ico 我想让我的促销代码解决方案尽可能快和脏的时间,所以我很好的URL参数。是否有一个简单的解决方案可以提取原始URL查询参数,而不必深入标题 编辑:我现在在下面共享我的根请求处理程序。favicon请求由代码前面的express favicon中间件处理Javascript Node Express app.get(*)req.url始终为/favion.ico,javascript,node.js,reactjs,express,server,Javascript,Node.js,Reactjs,Express,Server,我有一个Express服务器,我的应用程序通过该应用程序提供服务。获取“*”路由 我希望具有促销代码的用户可以从活动URL访问该网站,如:www.mysite.com/?code=123 问题是每个浏览器请求都被路由到favicon请求,因此我的req.url和req.query变量不能用于获取促销代码。Req.url始终为/favicon.ico,Req.query始终为空 我确实发现原始URL是请求对象的头,但这似乎是实现我目标的一种迂回方式。请求对象的原始URL字段也指向favicon.i
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>`)
);
});
})
您可以在express中接受动态值作为URL的一部分 api调用==>www.mysite.com/dynamic\u promo\u code 如果您希望您的促销代码是有见解的,并且不想成为URL的一部分 api调用==>www.mysite.com?promocode=dynamic\u promo\u code
问题是我使用的是React Router,它不支持查询参数:
为了解决这个问题,我在客户端上使用window.location.search来获取促销代码,然后使用显式促销处理程序传递到后端。我认为您应该试试这个@AdilLiaqat,但它不起作用。app.get'/favicon.ico',req,res=>{console.logIn get/favicon;res.sendStatus204;};app.get'*',req,res=>{console.logIn get*;…//为React应用程序提供服务}只打印来自get/favicon的日志。奇怪的是,这个应用程序是由get*提供的,所以它一定是以某种方式执行的。但是控制台日志必须被重定向到其他地方。而且。。。这条神奇的法维康路线在哪里?它显然拦截了所有的东西?您确定点击促销页面不会同时导致对favicon和促销页面的请求吗?因为浏览器通常就是这样工作的。@KevinB我已经尝试使用显式favicon请求处理程序和处理请求的中间件。在这两种情况下,favicon都会返回,web应用程序会得到服务,但根get请求中的req.query URL为空。这或多或少就是我现在正在做的。问题是favicon请求劫持了调用,然后使用用户在标题中输入的URL重新路由到预期的URL。我将尝试用中间件解决这个问题。您可以将favicon路由置于这些路由之上。或者你可以分享你的代码,这样我可以帮助你谢谢。我将在上面分享我的代码。我已经把法维康路线放在这些上面了。facvicon路由被调用,然后请求被转发到根调用,原始URL被屏蔽。我现在正在使用中间件来处理favicon,但同样的事情正在发生。您的全部代码请与favicon和promo code联系使用app.get*?*基本上用于通配符输入,因此它也将用于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>`)
);
});
})
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
});
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
})