16

为了学习 node.js,我正在创建一个小应用程序,它获取一些存储在 mongoDB 中的 rss 提要,处理它们并从这些提要中创建一个提要(按日期排序)。

它解析约 50 个 rss 提要的列表,其中包含约 1000 个博客项目,因此解析整个内容的时间很长,所以我放了以下内容req.connection.setTimeout(60*1000);以获得足够长的时间来获取和解析所有提要。

一切都运行得很好,但是请求被调用了两次。(我检查了wireshark,我不认为这与favicon有关)。

我真的不明白。

你可以在这里测试自己:http: //mighty-springs-9162.herokuapp.com/feed/mde/20(它应该创建一个包含最近 20 篇关于“mde”的文章的 rss 提要)。

代码在这里: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 函数仍然被调用了两次。

那里有什么问题?任何想法?

4

12 回答 12

10

这让我烦了很久。很可能是 Firebug 扩展在后台发送每个 GET 请求的副本。尝试关闭 Firebug 以确保不是问题所在。

于 2013-02-15T14:20:41.293 回答
5

我在本地机器上使用Google Cloud Functions Framework(用于express处理请求)时遇到了同样的问题。每个fetch请求(在浏览器控制台和网页中)都会导致对服务器的两个请求。该问题与 CORS 有关(因为我使用了不同的端口),ChromeOPTIONS在实际调用之前进行了方法调用。由于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 的回答暗示了这一点。

于 2020-06-12T17:01:43.617 回答
3

如果您的网站上有网站图标,请将其删除并重试。如果您的问题得到解决,请重构您的网站图标 url

于 2014-01-02T07:55:33.203 回答
2

I'm doing more or less the same thing now, and noticed the same thing.

I'm testing my server by entering the api address in chrome like this:

http://127.0.0.1:1337/links/1

my Node.js server is then responding with a json object depending on the id.

I set up a console log in the get method and noticed that when I change the id in the address bar of chrome it sends a request (before hitting enter to actually send the request) and the server accepts another request after I actually hit enter. This happens with and without having the chrome dev console open.

IE 11 doesn't seem to work in the same way but I don't have Firefox installed right now.

Hope that helps someone even if this was a kind of old thread :)

/J

于 2015-04-02T19:30:34.893 回答
2

我要修复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天的尝试

于 2020-08-10T14:51:57.953 回答
1

您可能不得不进一步增加超时。我还没有看到快速来源,但它只是在超时时发出声音,它会重试。

于 2013-07-19T02:07:09.637 回答
1

就我而言,我的 Axios POST 请求被 Express 接收了两次,第一个没有正文,第二个带有正确的有效负载。从 Postman 发送的相同请求仅正确接收一次。事实证明,Express 是在不同的端口上运行的,所以我的请求是跨源的。这导致 Chrome 向同一个 url(POST url)发送了一个预检 OPTION 方法请求,而我在 Express 中的 app.all 路由也处理了那个请求。

app.all('/api/:cmd', require('./api.js'));

将 POST 与 OPTIONS 分开解决了这个问题:

app.post('/api/:cmd', require('./api.js'));
app.options('/', (req, res) => res.send());
于 2020-04-30T23:43:48.893 回答
1

确保你给 res.send(); axios 调用需要来自服务器的值,因此会在 120 秒后发回调用请求。

于 2018-12-06T04:41:10.703 回答
1

我在使用 Express 4 时遇到了同样的问题。我相信这与它如何解决请求参数有关。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')
    }
})
于 2017-04-16T17:07:13.047 回答
0

我遇到了同样的问题。然后我尝试添加return,它没有工作。但是当我添加 return res.redirect('/path');

于 2014-12-31T16:25:57.953 回答
0

我有同样的问题。然后我打开 Chrome 开发工具,发现favicon.ico是我的 Express.js 应用程序请求的。我需要修复注册中间件的方式。

Chrome 开发工具截图

于 2020-10-30T21:12:22.557 回答
0

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

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

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

于 2021-04-02T09:51:08.893 回答