Nodejs Socket вешает трубку & ECONNRESET - отправка HTTP-запроса с Meteor на сервер Node js

Я использую сервер узлов для обработки всех моих сервисов push-уведомлений, таких как gcm и apn.

У меня есть 2 разных сервера. Один использует Meteor, а другой - Node.JS для обработки push-уведомлений. (Оба сервера разные)

Мое основное приложение работает на сервере Метеор.

Я отправляю HTTP-запрос на сервер node.js для отправки уведомлений.

Обычно это работает нормально, но иногда на сервере Meteor я получаю эту ошибку всякий раз, когда я вызываю сервер node.js:

socket hang up\n    at Object.Future.wait (/home/myPc/.meteor/packages/meteor-tool/.1.1.10.ki0ccv++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:398:15)\n    at Object.<anonymous> (packages/meteor/helpers.js:119:1)\n    at Object.HTTP.call (packages/meteorhacks_kadira/lib/hijack/http.js:10:1)\n    at Object.sendPushNotificationsMeteorServer (server/pushNotifications.js:249:1)\n    at server/classes/pushNotifications.js:244:1\n    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)\n    at packages/meteor/timers.js:6:1\n    at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1)\n    - - - - -\n    at createHangUpError (http.js:1473:15)\n    at Socket.socketOnEnd [as onend] (http.js:1569:23)\n    at Socket.g (events.js:180:16)\n    at Socket.emit (events.js:117:20)\n    at _stream_readable.js:944:16\n    at process._tickCallback (node.js:448:13)',
details: { [Error: socket hang up] stack: [Getter] },
data: { [Error: socket hang up] stack: [Getter] },
user: null,
userId: null,
toString: [Function] },
user: null,
userId: null,
toString: [Function] }

ИЛИ ЖЕ

 Ошибка: прочитайте ECONNRESET в Object.Future.wait (/home/mbm/.meteor/packages/meteor-tool/.1.1.10.12ml1tp++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fiber /future.js:398:15) в Object.call (packages/meteor/helpers.js:119:1) в Object.sendHttpCall (server/pushNotifications.js:249:1) на сервере /pushNotifications.js:244:1 на [объекте объекта]._. Exte.withValue (packages/meteor/dynamic_nodejs.js:56:1) на packages/meteor/timers.js:6:1 в runWithEnvironment (packages/meteor/dynamic_nodejs.js:110:1)
     - - - - - в errnoException (net.js:905:11) в TCP.onread (net.js:559:19)

Вот мой код сервера Node.JS:

realFs                = require('fs');
var gracefulFs        = require('graceful-fs');
gracefulFs.gracefulify(realFs);

var http              = require('http');
var express           = require('express');
var app               = express();

var path              = require("path");

configClass           = require('./classes/config.js').configClass;
helperClass           = require('./classes/helper.js').helperClass;
pushNotificationClass = require('./classes/pushNotification.js').pushNotificationClass;

var hostname          = 'http://localhost'; 
var port              = 6000;

var bodyParser        = require('body-parser');

nodeGcm               = require('node-gcm');
apn                   = require('apn');
apnService            = new apn.Connection(helperClass.getAPNOptions());

// -- BODY PARSER -- //
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

process.on('uncaughtException', function (err) {

  console.error(err);
  console.log("Node NOT Exiting...");
});

// All post requests
app.post('/', function(req, res){

  try {

    var response = JSON.parse(req.body.pushNotificationApiParams);
    var callType = req.body.callType;

    switch (callType) {
        case 'systemPushNotifications':
            return pushNotificationClass.sendPushNotificationsV2(response);
        break;
    } 
  }
  catch(e){

    console.dir(e.stack);
    realFs.appendFile('errorLogs/'+helperClass.getCurrentDateFormated()+'.log', helperClass.formatLog('Exception in main Post Method  : '+e.stack) , function (err) {
      if (err) throw err;
    });
  }

  res.send("OK");
});



app.listen(port, function () {
  console.log('Listening at '+hostname+':'+port);
});

А вот мой код со стороны Meteor, где я делаю HTTP-пост-запрос к узлу js server:

var headers = {
   'Content-Type' : 'application/x-www-form-urlencoded'
};

var postFields = {
   callType : 'systemPushNotifications',
   pushNotificationApiParams  : JSON.stringify(pushNotificationApiParams)   // contains push notifications data                 
};

HTTP.call("POST", 'http://localhost:6000', { params:postFields, headers:headers });

Кто-нибудь может направить меня в правильном направлении? Кроме того, я был бы очень признателен, чтобы узнать некоторые хорошие практики, а также.

Также

Есть еще одна проблема, с которой я сталкиваюсь. Мой сервер node.js выходит примерно через 24 часа. Я не знаю, почему это происходит. Он выходит без каких-либо ошибок или исключений в консоли терминала. Я должен перезапустить его каждый раз.

2 ответа

Решение

Хорошо, я нашел проблему сам здесь. Это в коде сервера узла. Я вставил return в оператор switch, который не является правильным способом возврата ответа в экспрессе, поэтому я просто удалил return из:

До:

switch (callType) {
   case 'systemPushNotifications':
      return pushNotificationClass.sendPushNotificationsV2(response);
   break;
}

Сейчас:

switch (callType) {
   case 'systemPushNotifications':
      pushNotificationClass.sendPushNotificationsV2(response);
   break;
}

Выше return завершал код до: res.send("OK");

Учитывая, что ошибка ECONNRESET обычно возникает, когда * другая сторона TCP connection закрывается внезапно

  • В случае вашей заявки это может быть связано с overloadingсервера и просто убивает соединение как возврат, который аналогичным образом блокирует соединение с вашимmeteor server

Чтобы получить больше информации об ошибке, как указано в этой теме. Чтобы обработать ошибку, вы должны использовать event listener чтобы показать все stack traces из этого

Как уже упоминалось в этой теме, Farid Nouri Neshat

Чтобы иметь одного прослушивателя для группы вызовов, вы можете использовать домены, а также ловить другие ошибки во время выполнения. Убедитесь, что каждая асинхронная операция, связанная с http (сервер / клиент), находится в другом доменном контексте, по сравнению с другими частями кода, домен автоматически прослушивает события ошибок и передает их своему собственному обработчику. Таким образом, вы только слушаете этот обработчик и получаете данные об ошибках.

но поскольку домен уже устарел, вы должны использовать кластеры, как указано здесь в документации, которая использует server.listen(message) и server.listen(handle)

или вы также можете использовать NODE_DEBUG=net или используйте strace

Обновить

Для отключения сервера я думаю, что ошибка может быть в вашей обработкеbodyparser.Для плохого json файл ошибка не обнаружена

Действие узла по умолчанию после неперехваченного исключения - завершить (аварийно завершить) процесс.

Обработка bodyparser для файла json может быть выполнена следующим образом.

var parseJson = bodyPaser.json();

app.use(function (req, res, next) {
    req.getBody = function (callback) {
        parseJson(req, res,function (err) {
          callback(err, req.body);
        });
    };
    next();
}); 

Ссылка взята с открытого номера GITHUB здесь

Обновление 2

В основном socket hangup означает, что сокет не завершает соединение в течение указанного периода времени

По словам источника, вы можете видеть, что это происходит, если сервер никогда не отправляет ответ

Эта ошибка должна быть поймана и обработана любым

  • повторное обращение к запросу.
  • справиться с этим позже, установив больше time period или положить res.end() в конце вашей функции, чтобы завершить соединение.
  • или вы можете использовать [http.get()][8] с get запросы, которые будут автоматически вызывать req.end() функция

Надеюсь, это поможет вам немного! Ура!

Другие вопросы по тегам