【问题标题】:Socket Hangup in Node, Express and MongoDBNode、Express 和 MongoDB 中的套接字挂断
【发布时间】:2019-02-14 07:21:52
【问题描述】:

我正在开发一个 MEAN 堆栈应用程序。我请求 coincap.io APIs 在 Node 和 Express 中使用 cronjobs 和请求库获取硬币数据,在获取数据后,我将每隔 5 分钟将数据推送到我的 MLAB MongoDb 实例中。

我在控制台中收到以下错误。

{ Error: connect ETIMEDOUT 104.17.39.95:80
    at Object._errnoException (util.js:999:13)
    at _exceptionWithHostPort (util.js:1020:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1207:14)
  errno: 'ETIMEDOUT',
  code: 'ETIMEDOUT',
  syscall: 'connect',
  address: '104.17.39.95',
  port: 80 }

{ Error: socket hang up
    at createHangUpError (_http_client.js:330:15)
    at Socket.socketOnEnd (_http_client.js:423:23)
    at Socket.emit (events.js:164:20)
    at endReadableNT (_stream_readable.js:1062:12)
    at process._tickCallback (internal/process/next_tick.js:152:19) code: 'ECONNRESET' }

下面是我在 server.js 文件中的猫鼬配置。

const options = {
    reconnectTries: 10, // Never stop trying to reconnect
    reconnectInterval: 500, // Reconnect every 500msi.e 0.5 sec
    poolSize: 15, // Maintain up to 15 socket connections
    socketTimeoutMS: 0, // Close sockets after 5 minute of inactivity
    connectTimeoutMS: 0,
    family: 4, // Use IPv4, skip trying IPv6
    keepAlive: true
};

// Connect to database via mongoose
mongoose.connect(config.database, options)
  .then(() => console.log(`MongoDB Connected ${config.database}`))
  .catch(err => console.log(err));

并且使用下面的代码将服务器设置为不超时,

app.listen(port, () => console.log(`Server started on port ${port}`));
app.listen().setTimeout(0); 

下面是获取URL提供的数据的功能。

var historyGraphTask = cron.schedule('*/15 * * * *', function () {
    CoinGraph.count(function (err, count) {
        if (err) {
            console.log(err);
        } else {
            CoinGraph.find({}, (err, coinData) => {
                if (err) {
                    console.log(err);
                } else {
                    for (var i = 0; i < coinData.length; i++) {
                        let symbol = coinData[i].symbol;
                        const historyUrl = 'http://coincap.io/history/' + symbol;
                        DataReq(historyUrl).then((data) => {
                            if (data === null || data === undefined) {
                                console.log('Data Error in cron job of graph');
                            } else {
                                const newData = data.Data;
                                HistoryData.findOneAndUpdate({symbol: symbol} , { data : newData  }, { safe: true, upsert: true }  ,(err, historyData) => {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        CoinGraph.findOneAndUpdate({ symbol: symbol }, { historyData: historyData._id }, { safe: true, upsert: true } , function (err, updatedData) {
                                            if (err) {
                                                console.log(err);
                                            } else {
                                                console.log(updatedData);
                                            }
                                        });
                                    }
                                }); 

                            }
                        }).catch((error) => {
                            console.log(error);
                        });

                    }
                }
            });
        }

    });
});

function DataReq(Url) {
    return new Promise((resolve, reject) => {
        request(Url, {timeout: 0}, function (error, response, body) {
            if (body === undefined || body === null || error) {
                console.log(error);
                return;
            } else {
                const Data = JSON.parse(body);
                if (Data) {
                    resolve({ Data });
                } else {
                    reject();
                }
            }
        });
    });
}

我做错了什么?我已经尝试了所有可能的解决方案,但长期以来一直坚持这一点。

【问题讨论】:

    标签: node.js mongodb sockets express


    【解决方案1】:

    根据您的代码,它看起来并没有结束。通过结束,我的意思是做任何回调来结束函数。

    我最初的发现是您需要以某种方式进行回调。

    我建议您在您使用的 CRON 库或 coingraph 文档中查看文档以正确处理请求。

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 2020-12-19
      • 2020-10-30
      • 2015-02-08
      • 2014-05-08
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多