要学习node.js我正在创建一个小应用程序,它可以获取存储在mongoDB中的一些RSS源,处理它们并从这些源创建一个源(按日期排序)。
它解析了~50个RSS源的列表,包含约1000个博客项目,因此解析整个内容需要很长时间,因此我将以下req.connection.setTimeout(60*1000);
放入足够长的时间来获取和解析所有饲料。
一切都运行得很好,但请求被调用了两次。 (我查看了wireshark,我认为这不是关于favicon的。)
我真的不明白。
你可以在这里测试自己:http://mighty-springs-9162.herokuapp.com/feed/mde/20(它应该创建一个rss feed,其中包含有关“mde”的最后20篇文章。)
代码在这里:https://github.com/xseignard/rss-unify
如果我们专注于有趣的事情:
我的路线定义如下:app.get('/feed/:name/:size?', topics.getFeed);
而topics.getFeed
就像这样:
function getFeed(req, res) {
// 1 minute timeout to get enough time for the request to be processed
req.connection.setTimeout(60*1000);
var name = req.params.name;
var callback = function(err, topic) {
// if the topic has been found
if (topic) {
// aggregate the corresponding feeds
rssAggregator.aggregate(topic, function(err, rssFeed) {
if (err) {
res.status(500).send({error: 'Error while creating feed'});
}
else {
res.send(rssFeed);
}
},
req);
}
else {
res.status(404).send({error: 'Topic not found'});
}};
// look for the topic in the db
findTopicByName(name, callback);
}
所以没什么特别的,但是,这个getFeed函数被调用了两次。
那里有什么问题?有什么想法吗?
答案 0 :(得分:10)
这让我很生气。 Firebug扩展很可能是在后台发送每个GET请求的副本。尝试关闭Firebug以确保不是问题。
答案 1 :(得分:3)
在本地计算机上使用Google Cloud Functions Framework(使用express
处理请求)时,我遇到了同样的问题。每个fetch
请求(在浏览器控制台和网页内)都向服务器发送了两个请求。问题与CORS有关(因为我使用的端口不同),因此Chrome在实际调用之前进行了OPTIONS
方法调用。由于我的代码中无需使用OPTIONS
方法,因此我使用了if语句来返回空响应。
if(req.method == "OPTIONS"){
res.set('Access-Control-Allow-Origin', '*');
res.set('Access-Control-Allow-Headers', 'Content-Type');
res.status(204).send('');
}
花了将近3个小时来敲我的头。感谢user105279的提示。
答案 2 :(得分:2)
如果您的网站上有favicon,请将其删除,然后重试。如果您的问题已解决,请重构您的favicon网址
答案 3 :(得分:2)
我现在或多或少做同样的事情,并注意到同样的事情。
我通过输入chrome中的api地址来测试我的服务器,如下所示:
我的Node.js服务器随后根据id响应json对象。
我在get方法中设置了一个控制台日志,并注意到当我更改chrome的地址栏中的id时,它会发送一个请求(在按下enter之前实际发送请求)并且服务器在我实际接受了另一个请求之后打进去。无论是否打开chrome dev控制台,都会发生这种情况。
IE 11似乎没有以相同的方式工作,但我现在没有安装Firefox。
希望能帮助某人,即使这是一种旧线程:)
/ J
答案 4 :(得分:1)
您可能需要进一步增加超时。我没有看到快递源,但它只是在超时时发出声音,它会重试。
答案 5 :(得分:1)
就我而言,Express收到了两次我的Axios POST请求,第一个没有正文,第二个带有正确的有效负载。从邮递员发送的相同请求仅正确接收一次。事实证明,Express是在其他端口上运行的,因此我的请求是跨源的。这导致Chrome将预检OPTION方法请求发送到相同的网址(POST网址),而我的应用程序。Express中的所有路由也都处理了该请求。
app.all('/api/:cmd', require('./api.js'));
将POST与OPTIONS分开可以解决此问题:
app.post('/api/:cmd', require('./api.js'));
app.options('/', (req, res) => res.send());
答案 6 :(得分:1)
我要修复listen.setTimeout
和axios.defaults.timeout = 36000000
节点js
var timeout = require('connect-timeout'); //express v4
//in cors putting options response code for 200 and pre flight to false
app.use(cors({ preflightContinue: false, optionsSuccessStatus: 200 }));
//to put this middleaware in final of middleawares
app.use(timeout(36000000)); //10min
app.use((req, res, next) => {
if (!req.timedout) next();
});
var listen = app.listen(3333, () => console.log('running'));
listen.setTimeout(36000000); //10min
反应
import axios from 'axios';
axios.defaults.timeout = 36000000;//10min
尝试2天后
答案 7 :(得分:0)
我遇到了同样的问题。然后我尝试添加返回,它没有用。但是当我添加return res.redirect('/ path');
时它会起作用答案 8 :(得分:0)
我使用Express 4做同样的问题。我相信它与ow有关,它解决了请求参数。解决方案是确保通过con.Open();
块中的params
块检查来解决if
。
app.get('/:conversation',(req, res) => {
let url = req.params.conversation;
//Only handle request when params have resolved
if(url){
res.redirect(301, 'http://'+ url + '.com')
}
})
答案 9 :(得分:0)
确保您提供res.send(); axios呼叫期望来自服务器的值,因此在120秒后发回呼叫请求。
答案 10 :(得分:0)
我有同样的问题。然后,我打开了Chrome开发工具,发现favicon.ico
是我的Express.js应用程序所要求的。我需要修复注册中间件的方式。
答案 11 :(得分:0)
我也有双重要求。就我而言,它是从 http 到 https 协议的转发。您可以通过查看比较来检查是否是这种情况
req.headers['x-forwarded-proto']
它将是“http”或“https”。 我可以通过调整中间件触发的顺序来解决我的问题。