Node.js + AngularJS + Socket.io: datos push no disponibles en el controller

Configuré mi server de nodo para enviar algunos datos a intervalos aleatorios, y los datos llegan al cliente / browser; sin embargo, no puedo entender cómo acceder a él en el controller de mi aplicación.

#node.js file: /server.js (truncated for brevity) var http = require('http').createServer(handler),//refers to handler() fs = require('fs'), io = require('socket.io').listen(http); http.listen(8000); … io.sockets.on('connection', function (socket) { /* DUMMY CODE: this generates fake alerts at random intervals */ (function loop() { var rand = Math…; … setTimeout(function(){ … var alert = { … }; socket.emit('alert', { "alert": alert });//socket.emit() loop(); }, rand); }()); });//io.sockets.on() 

Cuando logging la alert a la Terminal, se ve así:

 alert: { id: 258, lat: -95.20933, long: 37.027676, neighbourhood: "Downtown", time: //stringified js timestamp } 

Y los arguments de abajo contienen los datos que quiero (básicamente lo mismo que la alert ).

 # /app/js/services.js angular.module( 'BAR.services' , []) .factory('socketio', function($rootScope){ var socket = io.connect(); return { on: function(event, callback) { socket.on(event, function(){ //console.log(arguments); $rootScope.$apply(function(){ callback.apply(socket, arguments); });//$rootScope.$apply() });//socket.on() },//on emit: function(event, data, callback) { socket.emit(event, data, function(){ //console.log(arguments); $rootScope.$apply(function(){ if (callback) callback.apply(socket, arguments); });//$rootScope.$apply() });//socket.emit() },//emit disconnect: function() { socket.disconnect(); } }//return });// AlertServices 

Sin embargo, no puedo entender cómo acceder a los datos de los arguments en mi controller:

 # /app/js/controllers.js function Alerts( $scope , socketio ) { socketio.on('alert', function(data) { console.log(data); /* I expect this to be the data I want */ $scope.alert = data.alert; }); $scope.disconnect = function(){ socketio.disconnect(); } } Alerts.$inject = ['$scope','socketio']; 

Cuando logging data en la console del browser aquí en el controller, aparece un object enorme que parece ser el padre de $scope ; y data.alert no está definido. También traté de especificar un segundo parámetro como este socketio.on('alert', function( data , args ) arguments socketio.on('alert', function( data , args ) pensando que podría tratarse de arguments (ya que callback.apply( … ) en services tiene 2), pero cuando lo hice y lo logré para consoler, args devueltos indefinidos.

Por cierto, basé esto en un tutorial de un interno de AngularJS. Las diferentes piezas tenían los mismos nombres, así que me costó un poco descifrar qué hacía cada una de las diferentes piezas (tampoco fue útil que estuviese en Jade).

Lo que realmente quiero hacer es actualizar un enlace en mi opinión con los datos de la alert .

One Solution collect form web for “Node.js + AngularJS + Socket.io: datos push no disponibles en el controller”

En sus funciones de on y emit , está utilizando:

 socket.on(event, function() { $rootScope.$apply(function() { callback.apply(socket, arguments); }); }); 

pero en la versión original de esto del tutorial, dice:

 socket.on(eventName, function() { var args = arguments; $rootScope.$apply(function () { callback.apply(socket, args); }); }); 

Los var args = arguments es importante, ya que establece args para los arguments pasados ​​a la callback a socket.on (que es la información que está buscando). Sin este paso, cuando realmente usa arguments , resuelve los arguments pasados ​​a la callback a $rootScope.$apply (que es un scope angular según la documentation , explicando por qué obtiene el resultado de la console).

La solución sería capturar los arguments fuera de la llamada a $apply y pasarlos a su callback:

 socket.on(event, function() { var args = arguments; $rootScope.$apply(function() { callback.apply(socket, args); }); }); 
  • Websockets entre 2 serveres?
  • ¿Cómo implementar y comunicarse a través de websockets en una aplicación iOS?
  • ¿Hay una biblioteca javascript en el lado del cliente para hacer queue en las requestes ajax con soporte de almacenamiento?
  • No se pudo establecer la connection WebSocket a 'wss: // localhost: 44300 / Home / websocketcon': error durante el protocolo de enlace WebSocket: código de respuesta inesperado: 404
  • File API - Blob a JSON
  • ¿Cómo limitar la cantidad de datos que envía el cliente a través de websocket?
  • Ejemplo de chat multi room node.js
  • Websocket: error durante el protocolo de enlace WebSocket: código de respuesta inesperado: 404
  • ¿Por qué WebSockets usa un hash en handshake?
  • Uso seguro de eval () en el código JavaScript enviado por el server
  • Solicitud de sondeo para actualizar los Modelos / Vistas Generales
  • ¿Cómo digo el tipo de parámetro websocket onmessage?
  • Cómo hacer una request de dominio cruzado
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.