2014-04-20 2 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 문서를 알고있는 것처럼, 새로운 모델 인스턴스가 생성 된 소켓을 통해 전송되는 메시지는, 모델을 통해 사용할 수 있습니다 이름.

socket = io.connect() 

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

내가 socket.on 'connect'. -> console.log 'hey'에 알림을받을 수 있기 때문에 '환경', 작동 확인했습니다,하지만 난 모델 이벤트에 대한 어떤을하지 않습니다

그래서 나는이 내 app.coffee 파일에 냈다있다 레코드를 만들거나 파괴하라!

청사진이 활성화되었습니다. 무엇을 바꾸어야합니까? 여기

업데이트

내가 그것을 사용하는 방법을 좀 더 코드 :

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

그래서, 소켓이 모든 이벤트에 가입해야합니다.

나중에 나는이 이벤트에 후크하려면 :

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

그러나 통지 결코 얻을.

업데이트 2

내 컨트롤러 CollectionController.js은 다음과 같습니다

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

나는 또한 동일한 문제가 있습니다. – Moon

답변

6

기본적으로 당신이 때 통지해야한다, 그래서 당신은, 당신이 socket.get('/collection') 할 때 find 청사진에 의해 반환 된 모든 인스턴스에 등록됩니다 그들 중 하나는 업데이트되거나 파괴됩니다. 그러나 a) 명시 적으로 을 Sails 코드로 호출하거나 b) autoWatch/config/blueprints.js에서 true로 설정하지 않으면 레코드가 인 메시지가 인 경우 알림을받지 못합니다. 자세한 내용은 reference for .watch().subscribe()을 참조하십시오.

일반적인 아이디어는 수천 또는 수백만 명의 사용자가있을 수있는 대규모 앱의 경우 새 사용자가 생성 될 때마다 연결된 모든 소켓에 알림을 보내는 것이 바람직하지 않다는 것입니다. 소켓은 특별히 가입 한 인스턴스의 변경 사항에 대해서만 알림을 받아야합니다.

업데이트 마침내 문제의 코드를 검토받은 후

, 그 필요가 관심가는 몇 가지가있는 것 같습니다 :

  1. 소켓 이벤트 코드에 대한 경청하고 Collection이지만, collection이어야합니다. Collection은 모델의 전역 화 된 ID이지만 collectionID이며 이벤트 이름으로 사용됩니다. 여기 사건이 중요합니다.
  2. 마찬가지로 /config/blueprints.js의 설정은 대소 문자를 구분합니다. 당신은 그것을 autowatch으로 가지고 있습니다.
  3. 기본적으로 자신이 트리거하는 이벤트에 대한 청사진에서 소켓 알림을받지 못합니다. 소켓 요청 메소드의 콜백을 대신 사용할 수 있습니다 (예 : socket.post(url, data, callback)). 이렇게하면 다른 사람이 실행 한 행동이 아니라 자신이 실행 한 행동에 다르게 대응할 수 있습니다. 청사진에서 직접 소켓 알림을 받으려면 mirror: true/config/blueprints.js에 설정할 수 있습니다.

    내가 그 세 가지를 변경하면이 코드가 잘 작동)

그것은 당신이 생산에 사용 후회 수 있습니다 주로 개발 도구 비록 mirror 같은 요구는 문서에 추가 할 보인다!

+0

컨트롤러 동작에'Collection.watch (req);'가 포함되어 있습니다. 나는'socket.get'을 호출 한 후'socket.delete'를 수행했으나 나중에 통지를받지 못하고 작동하지 않습니다. Sails 0.9에서는 모든 것이 완벽하게 작동했습니다. 새로운 'sails.io.js'에 실수가있을 수 있습니까? – Robin

+0

websocket이 데이터를 쓰고있는 것을 볼 수 있습니다 : verbose : websocket 6 ::: 4 + [{ "...'는 결코'socket.on'에 안착하지 않습니다 .. – Robin

+0

'Collection.watch (req)'가 있어야합니다. * socket * 요청에 대한 응답으로 호출되며, HTTP 요청에 응답하는 뷰를 제공하는 액션에서이를 호출하면 작동하지 않습니다. 테스트에서'autoWatch'를 켜는 것이 좋습니다. 그러나'socket.delete' 'socket.get' 이후에 알림을 받게 될 것입니다. 여기에있는 빠른 테스트는 잘 돌아갑니다. 나는'log - silly'을 시도하고 소켓이 인스턴스에 올바르게 등록되어 있는지 확인하려고합니다. – sgress454

관련 문제