NodeJS Socket hang up & ECONNRESET-requête HTTP post de Meteor à Node JS server

j'utilise un serveur de noeuds pour gérer tous mes services de notification push comme gcm et apn.

j'ai 2 serveurs différents. L'un exécute Meteor et l'autre exécute Node.JS pour gérer les notifications push. (Les deux sont des serveurs différents)

mon application principale fonctionne sur le serveur Meteor.

je fais une requête HTTP post au noeud.js serveur pour envoyer mes notifications.

D'habitude ça marche très bien, mais parfois sur le serveur Meteor je reçois cette erreur chaque fois que j'appelle le nœud.serveur js:

socket hang upn    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:1n    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)n    at packages/meteor/timers.js:6:1n    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:16n    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] }

OR

 Error: read ECONNRESET
     at 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/fibers/future.js:398:15)
     at Object.call (packages/meteor/helpers.js:119:1)
     at Object.sendHttpCall (server/pushNotifications.js:249:1)
     at server/pushNotifications.js:244:1
     at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)
     at packages/meteor/timers.js:6:1
     at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1)
     - - - - -
     at errnoException (net.js:905:11)
     at TCP.onread (net.js:559:19)

Voici mon noeud.Code du serveur 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);
});

Et voici mon code de Meteor côté, où je suis de faire des requête HTTP post à nœud serveur js:

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 });

quelqu'un Peut-il me guider dans la bonne direction? En outre, j'apprécierais vraiment de connaître quelques bonnes pratiques ainsi.

il y a un autre problème auquel je fais face. Mon nœud.le serveur js sort après 24 heures. Je ne sais pas pourquoi cela arrive. Il se termine sans aucune erreur ou exception dans la console du terminal. Je dois le redémarrer à chaque fois.

19
demandé sur StormTrooper 2016-12-20 15:03:29

2 réponses

considérant le ECONNRESET l'erreur se produit habituellement lorsque l'autre côté de la TCP connection est fermé brusquement.

  • dans le cas de votre demande elle peut être due à l' overloading du serveur et supprime simplement la connexion comme un retour qui bloque de la même manière la connexion à votre meteor server

Pour obtenir plus d'infos sur l'erreur comme indiqué dans ce thread. Pour gérer le erreur, vous devez utiliser un event listener pour montrer l'intégralité de l' stack traces

Comme mentionné dans ce fil par Farid Nouri Neshat

Pour avoir un listener pour un groupe d'appels, vous pouvez utiliser des domaines et également prendre d'autres erreurs à l'exécution. Assurez-vous que chaque opération async liée à http(Serveur/Client) est différente domaine contexte comparé aux autres parties du code, le domaine écoutera automatiquement aux événements d'erreur et le propagera à son propre gestionnaire. Donc, vous n'écoutez que de gestionnaire et d'obtenir les données d'erreur.

mais puisque le domaine a déjà été déprécié, vous devez utiliser les clusters comme mentionné ici dans le docs qui utilise server.listen(message) et server.listen(handle)

ou vous pouvez également utiliser NODE_DEBUG=net ou utiliser strace

mise à Jour

pour le déconnexion du serveur je pense que l'erreur pourrait être dans votre manipulation de la bodyparser.mauvaisjson le fichier erreur non interceptée.

l'action par défaut D'un noeud suivant une exception uncaught estexit (crash) sur le processus.

traitement de bodyparser pour un fichier json peut être fait de la manière suivante.

var parseJson = bodyPaser.json();

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

référence tirée du GitHub open issue ici

mise à Jour 2

Fondamentalement, le socket hangup signifie que l' socket ne pas mettre fin à la connexion à l'intérieur de la période de temps spécifiée

Selon source vous pouvez voir qu'il se produit si le serveur n'envoie jamais la réponse

.Cette erreur doit être détectée et traitée par

  • nouvelle tentative à l' demande.
  • gérer plus tard en définissant plus time period ou mettre res.end() fin de votre fonction pour mettre fin à la connexion.
  • ou vous pouvez utiliser le [http.get()][8]get requêtes qui appelleront automatiquement le req.end() function

J'espère que ça vous aidera un peu! Acclamations!

5
répondu Pritish Vaidya 2017-05-23 12:33:32

Ok j'ai trouvé le problème moi-même ici. C'est dans le code du serveur de noeuds. J'ai mis de retour dans une instruction switch qui n'est pas un moyen valable de renvoyer une réponse dans l'express, donc j'ai juste enlevé le retour de:

Avant:

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

Maintenant:

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

return terminait le code avant le: res.send("OK");

0
répondu StormTrooper 2017-01-14 08:43:40