web-dev-qa-db-fra.com

Nodejs Socket raccroche et ECONNRESET - Demande de publication HTTP de Meteor à Node js server

J'utilise un serveur de nœuds pour gérer tous mes services de notifications Push comme gcm et apn.

J'ai 2 serveurs différents. L'un exécute Meteor et un 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 demande de publication HTTP au serveur node.js pour envoyer mes notifications.

Habituellement, cela fonctionne bien, mais parfois sur le serveur Meteor j'obtiens cette erreur chaque fois que j'appelle le serveur 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] }

OU

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

Voici mon code de serveur 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);
});

Et voici mon code du côté Meteor, où je fais une demande de publication HTTP au serveur node 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? J'apprécierais également de connaître également quelques bonnes pratiques.

Aussi

Il y a encore un problème auquel je suis confronté. Mon serveur node.js se ferme après environ 24 heures. Je ne sais pas pourquoi cela se produit. Il se ferme sans erreur ni exception dans la console du terminal. Je dois le redémarrer à chaque fois.

20
StormTrooper

Ok, j'ai trouvé le problème moi-même ici. C'est dans le code du serveur de noeud. J'ai mis return dans une instruction switch qui n'est pas un moyen valide de retourner une réponse en express, donc je viens de supprimer le retour de:

Avant:

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

Maintenant:

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

Le return ci-dessus terminait le code avant: res.send("OK");

0
StormTrooper

Compte tenu de l'erreur [~ # ~] econnreset [~ # ~] se produit généralement lorsque * l'autre côté du TCP connection Est fermé brusquement.

  • Dans le cas de votre application, cela peut être dû au overloading du serveur et tue simplement la connexion comme un retour qui de la même manière bloque la connexion à votre meteor server

Pour obtenir plus d'informations sur l'erreur comme mentionné dans ce thread . Pour gérer l'erreur, vous devez utiliser un event listener Pour afficher le stack traces Complet

Comme mentionné dans ce fil par Farid Nouri Neshat

Pour avoir un seul écouteur pour un groupe d'appels, vous pouvez utiliser des domaines et également détecter d'autres erreurs lors de l'exécution. Assurez-vous que chaque opération asynchrone liée à http (serveur/client) est dans un contexte différent domaine par rapport aux autres parties du code, le domaine écoutera automatiquement les événements d'erreur et le propagera à son propre gestionnaire. Vous n'écoutez donc que ce gestionnaire et obtenez les données d'erreur.

mais comme 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 gestion du bodyparser. Pour un mauvaisjson fichier l'erreur non détectée.

L'action par défaut du nœud suite à une exception non interceptée consiste à quitter (planter) sur le processus.

La gestion du bodyparser pour un fichier json peut être effectuée 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 problème ouvert du GITHUB ici

Mise à jour 2

Fondamentalement, le socket hangup Signifie que le socket ne met pas fin à la connexion dans le délai spécifié

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

Cette erreur doit être détectée et gérée par

  • réessayer à la demande.
  • le gérer plus tard en définissant plus de time period ou en mettant res.end() à la fin de votre fonction pour mettre fin à la connexion.
  • ou vous pouvez utiliser la fonction [http.get()][8] avec les requêtes get qui appellera automatiquement la fonction req.end()

J'espère que cela pourrait vous aider un peu! À votre santé!

5
Pritish Vaidya