Express请求被调用两次

时间:2012-10-31 02:05:51

标签: node.js http express

要学习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函数被调用了两次。

那里有什么问题?有什么想法吗?

12 个答案:

答案 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地址来测试我的服务器,如下所示:

http://127.0.0.1:1337/links/1

我的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.setTimeoutaxios.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应用程序所要求的。我需要修复注册中间件的方式。

Screenshot of Chrome dev tools

答案 11 :(得分:0)

我也有双重要求。就我而言,它是从 http 到 https 协议的转发。您可以通过查看比较来检查是否是这种情况

req.headers['x-forwarded-proto']

它将是“http”或“https”。 我可以通过调整中间件触发的顺序来解决我的问题。