javascript - rooms - socket.io example
Nodejs Socket cuelga y ECONNRESET-Solicitud de publicaciĆ³n HTTP del servidor Meteor to Node js (2)
Estoy usando un servidor de nodo para manejar todos mis servicios de notificaciones push como gcm y apn.
Tengo 2 servidores diferentes. Uno ejecuta Meteor y otro ejecuta Node.JS para manejar las notificaciones push. (Ambos son servidores diferentes)
Mi aplicación principal se ejecuta en el servidor Meteor.
Realizo una solicitud de publicación HTTP al servidor node.js para enviar mis notificaciones.
Por lo general, funciona bien, pero a veces en el servidor Meteor me sale este error cada vez que llamo al servidor 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] }
O
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)
Aquí está mi código de servidor 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);
});
Y aquí está mi código del lado de Meteor, donde hago una solicitud de envío HTTP al servidor del nodo 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 });
¿Alguien puede guiarme en la dirección correcta? También me gustaría mucho conocer algunas buenas prácticas también.
también
Hay un problema más que estoy enfrentando. Mi servidor node.js sale después de unas 24 horas. No sé por qué sucede eso. Sale sin ningún error o excepción en la consola del terminal. Tengo que reiniciarlo cada vez.
Ok, encontré el problema yo mismo aquí. Está en el código del servidor de nodo. Puse return en una declaración de cambio que no es una forma válida de devolver una respuesta en modo expreso, así que simplemente eliminé la devolución de:
Antes de:
switch (callType) {
case ''systemPushNotifications'':
return pushNotificationClass.sendPushNotificationsV2(response);
break;
}
Ahora:
switch (callType) {
case ''systemPushNotifications'':
pushNotificationClass.sendPushNotificationsV2(response);
break;
}
La return
anterior estaba terminando el código antes de: res.send("OK");
Por lo general, el error ECONNRESET se produce cuando el otro lado de la TCP connection
se cierra bruscamente.
- En el caso de su aplicación, puede deberse a la
overloading
del servidor y simplemente mata la conexión como un retorno que, de la misma manera, bloquea la conexión a sumeteor server
Para obtener más información sobre el error como se menciona en este thread . Para manejar el error, debe usar un event listener
para mostrar los stack traces
completos de la stack traces
Como se menciona en este hilo por Farid Nouri Neshat
Para tener un oyente para un grupo de llamadas, puede usar dominios y también detectar otros errores en tiempo de ejecución. Asegúrese de que cada operación asíncrona relacionada con http (Servidor / Cliente) esté en un contexto de domain diferente en comparación con las otras partes del código, el dominio escuchará automáticamente los eventos de error y lo propagará a su propio controlador. Así que solo escuchas ese controlador y obtienes los datos de error.
pero como el dominio ya ha quedado en desuso, debe usar clústeres como se menciona aquí en los docs que usan server.listen(message)
y server.listen(handle)
o también puedes usar NODE_DEBUG=net
o usar strace
Actualizar
Para la desconexión del servidor, creo que el error podría estar en su manejo del bodyparser
Para un archivo json
defectuoso , el error no se detecta .
La acción predeterminada del nodo después de una excepción no detectada es salir (bloquear) en el proceso.
El manejo del bodyparser para un archivo json se puede hacer de la siguiente manera.
var parseJson = bodyPaser.json();
app.use(function (req, res, next) {
req.getBody = function (callback) {
parseJson(req, res,function (err) {
callback(err, req.body);
});
};
next();
});
Referencia sacada del número abierto de GITHUB here
Actualización 2
Básicamente, el socket hangup
del socket hangup
significa que el socket no finaliza la conexión dentro del período de tiempo especificado
Según la source , puede ver que ocurre si el servidor nunca envía la respuesta
.Este error debe ser atrapado y manejado por cualquiera
- volviendo a intentarlo a la solicitud.
- manejarlo más tarde configurando más
time period
o ponerres.end()
al final de su función para finalizar la conexión. - o puede usar
[http.get()][8]
con las solicitudes deget
que llamarán automáticamente a la funciónreq.end()
Espero que te pueda ayudar un poco! ¡Aclamaciones!