tutorial socket rooms nodejs example ejemplo javascript node.js http express meteor

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 su meteor 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 poner res.end() al final de su función para finalizar la conexión.
  • o puede usar [http.get()][8] con las solicitudes de get que llamarán automáticamente a la función req.end()

Espero que te pueda ayudar un poco! ¡Aclamaciones!