2014-04-20 3 views
5

я модель под названием Collection.js и это выглядит следующим образом:Как получить события сокета в sails.js 0.10?

module.exports = { 
    attributes: { 
     title: { 
      type: 'string', 
      required: true 
     }, 
     description: { 
      type: 'text', 
      required: false 
     }, 
     sessions: { 
      collection: 'session', 
      via: 'collection' 
     } 
    } 
} 

Как я понимаю this документа, сообщение, которое посылается через сокет, когда был создан новый экземпляр модели, доступно через модель имя.

Так я это пропущено в моем app.coffee файле:

socket = io.connect() 

socket.on 'collection', -> 
    console.log 'hey' 

Я подтверждено, что «окружающая среда» работает, потому что я получаю уведомления о socket.on 'connect'. -> console.log 'hey', но я не получаю для модельных событий как создать или уничтожить запись!

Буквы активированы. Что мне нужно изменить?

Update

Вот некоторый код, как я хочу, чтобы использовать его:

$('document').ready -> 
    noData = $('#list tr') 
    socket.get '/collection', (res) -> 
     createList(res) 

Итак, сокет должен быть подписан на все события.

Позже я хочу зацепить это событие:

socket.on 'collection', (res) -> 
    socket.get '/collection', (res) -> 
     recreateList(res) 

Но не получить никогда не уведомило.

Update 2

Мой контроллер CollectionController.js выглядит следующим образом:

module.exports = { 
    manage: function(req, res) { 
     Collection.watch(req); 
     return res.view(); 
    } 
} 
+5

У меня также такая же проблема. – Moon

ответ

6

По умолчанию, вы будете подписаны на всех экземпляров, возвращенных find план, когда вы делаете socket.get('/collection'), так что вы должны быть уведомлены, когда любой из них обновляется или уничтожается. Тем не менее, вы не получите уведомлений о записях , созданных, если вы не a) явно не вызвали Collection.watch(req) в коде Sails, либо b) установили autoWatch в true в /config/blueprints.js. См. reference for .watch() и .subscribe() для получения дополнительной информации.

Общая идея заключается в том, что для крупномасштабного приложения, которое может иметь тысячи или миллионы пользователей, не имеет смысла отправлять уведомления каждому подключенному сокету всякий раз, когда создается новый пользователь. Сокеты должны быть уведомлены только об изменениях в экземплярах, на которые они специально подписались.

Update

После наконец-то пересмотреть код в вопросе, похоже, есть несколько вещей, которые собираются на которые нужно обратить внимание:

  1. События сокета прослушиваемого в коде Collection, но это должно быть collection. Collection - это глобальный идентификатор модели, но collection - его идентификатор , который используется как название события. Дело здесь.
  2. Аналогичным образом установка autoWatch в /config/blueprints.js чувствительна к регистру; у вас есть autowatch.
  3. По умолчанию вы не получаете уведомлений сокетов из чертежей для событий, которые вы сами запускаете. Вместо этого вы можете использовать обратный вызов из методов запроса сокета (то есть socket.post(url, data, callback)). Это позволяет вам реагировать по-разному на действия, которые вы запускали самостоятельно, а не на те, которые были вызваны кем-то другим. Если вы действительно хотите получить свои собственные уведомления о сокетах из чертежей, вы можете установить mirror: true в /config/blueprints.js.

Это выглядит как mirror должна быть добавлена ​​к документации, хотя это в основном DEV инструмент, который вы можете сожалеть об использовании в производстве;)

После того, как я изменил эти три вещи, код работал отлично!

+0

Мое действие контроллера содержит 'Collection.watch (req);'. Я выполнил 'socket.delete' после того, как я назвал' socket.get', но после этого не получаю уведомления, и он не работает. С Sails 0.9 все работало безупречно. Возможно ли, что в новом 'sails.io.js' есть ошибка? – Robin

+0

Я вижу, что websocket пишет данные 'verbose: websocket writing 6 ::: 4 + [{" ... ', но он никогда не попадает в' socket.on'. – Robin

+0

'Collection.watch (req)' должен быть вызванный в ответ на запрос * сокета *, вызов его в действии, который служит вашему представлению (который отвечает на HTTP-запрос), не будет работать. В качестве теста попробуйте включить 'autoWatch'. Однако' socket.delete' после того, как 'socket.get' должен привести к приему уведомления, быстрый тест здесь работает нормально.Я бы попробовал' sails log -silly' и проверить, что сокет подписывается на экземпляры правильно. – sgress454

Смежные вопросы