2015-12-08 2 views
1

У меня есть приложение AngularJS, которое я пытался просто запустить сокет при создании/удалении элементов в моей БД. Я переключился с использования ресурса $ на io.socket.post() с помощью настраиваемого метода контроллера ('socketCreate'), однако не знаю, почему ни один из моих обратных вызовов сокета не запускается.Sails.js IO.socket не работает

Sails JS console регистрирует нового пользователя, новый пользователь создан, а угловой возвращает данные из сокета и обновляет список. Все это работает правильно, однако обратный вызов io.socket.on не срабатывает.

Неужели я не получаю событие? Правильно?

Угловая Контроллер:

$scope.newUser = function() { 
    io.socket.post('/users/socketCreate', {name: $scope.temp_user.name}, function(data, jwres) { 
     $scope.refreshUsers(); 
     $scope.temp_user = {}; 
    }); 
}; 

if(!io.socket.newUserListen) { 
    io.socket.newUserListen = true; 
    console.log(io.socket.newUserListen); 

    io.socket.on('users', function onServerSentEvent(msg) { 
     console.log('users', msg); 
    }); 

    io.socket.on('user', function onServerSentEvent(msg) { 
     console.log('user', msg); 
    }); 
} 

Sails Контроллер:

module.exports = { 
    socketCreate: function(req, res) { 
     var newName = req.param('name'); 
     if(newName && req.isSocket) { 
      Users.create({ name: newName }).exec(function created(err, newGuy){ 
       Users.publishCreate({ 
        id:newGuy.id, 
        name: newGuy.name 
       }); 
       console.log('User Created...'); 
       res.ok(newGuy); 
      }) 
     } else if(req.isSocket) { 
      Users.watch(req); 
     } else { 
      console.log(newName, req.isSocket); 
     } 

    } 
} 

ответ

1

Причина обратные вызовы событий не стрелять, потому что вы должны подписаться на комнату, которая генерируется автоматически с помощью парусов. Один из способов сделать это - использовать чертежи Sails. Так что, если вы добавите это к вашему угловому контроллеру вы должны увидеть событие огня:

io.socket.get('/users', function(data) {}); 

Делая этот запрос сокета получить вы выполняющийся в плане: найти действие, которое автоматически подписывается сокет в комнату. В качестве альтернативы вы можете создать другое действие, которое использует метод .watch() сделать то же самое:

join: function(req, res) { 
    Users.watch(req); 

    return res.ok(); 
}, 

И затем вызвать его из контроллера:

io.socket.put('/users/join', function(data) {}); 
+1

Это хорошо работало. Вместо использования моей фабрики AngularJS, которую я создал для конечной точки пользователя, в итоге я использовал io.socket.get, данные обратного вызова, которые были равны моим $ scope.users. Мне нужно было запустить $ scope. $ Apply(); хотя, чтобы получить представление для обновления, но теперь работает в нескольких браузерах (добавление и удаление данных) –

+0

Отличный ... хороший вызов в $ scope. $ apply(). – JohnGalt