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.
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 à votremeteor 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 mettreres.end()
fin de votre fonction pour mettre fin à la connexion. - ou vous pouvez utiliser le
[http.get()][8]
get
requêtes qui appelleront automatiquement lereq.end()
function
J'espère que ça vous aidera un peu! Acclamations!
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");