3

私は publishCreate メッセージブロードキャストに固執しましたが、何が間違っているのかわかりません。

Sample という名前の単純なモデルを作成しました。

module.exports = {
    attributes: {
        device: 'string',
        value: 'float'
    },

    afterCreate: function(sample, next) {
        console.log("afterCreate called");
        Sample.publishCreate({value: sample.value});
        console.log("publishCreate sent");
        next();
    }
};

モデルが自動的に publishCreate を行うかどうかをドキュメントで見つけられなかったので、afterCreate を追加しました。

次に、次のビューを作成しました。

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="/styles/iphone.css">   
    <!-- Bring in the socket.io client -->
    <script type="text/javascript" src="/js/socket.io.js"></script>
    <!-- then beef it up with some convenience logic for talking to Sails.js -->
    <script type="text/javascript" src="/js/sails.io.js"></script>
    <!-- listen on socket.io for incoming messages -->
    <script type="text/javascript" src="/js/app.js"></script>
    <script type="text/javascript">
        socket.on('message', function(msg){
            alert('message received');
        });
    </script>
</head>
<body>
    <div class="block" style="height: 320px;">
        <div class="centered">
            <h1><%= temp %>°</h1>
        </div>
    </div>
</body>
</html>

理論的には、ブラウザでビューを呼び出してから、他のブラウザタブで呼び出すと

http://localhost:1337/sample/create?device=AA&value=10.0

上記のビューでクライアント側でメッセージを受信する必要がありますが、何も起こりません。

メッセージから、ソケットが接続され、新しいサンプルが作成されると publishCreate が呼び出されることがわかります。

理由は何ですか?res.view() を呼び出すときにコントローラーで何かをする必要がありますか?

4

3 に答える 3

2

コントローラーの create アクションで publishCreate を明示的に宣言しましたか?

'create': function(req,res,next){
  Sample.create(req.params.all(), function sampleCreated(err,sample){
    if(err){console.log(err); }
   Sample.publishCreate({
    id:sample.id,
    device: sample.device,
    value: sample.value
  });   
 });
},

パブリッシュするデータ ポイントを明示的に宣言する必要があります。ここでは、ID、デバイス、値を明示的に公開するように設定しています。ブループリントと自動コントローラー マッピングは便利ですが、特にドキュメントが不足しているため、非常に不安定で信頼できない場合があります。具体的にしたほうがいいです。

于 2013-09-24T15:01:10.343 に答える
2

ここで考えられる問題は、呼び出しを含むコントローラー アクションが、ソケット要求 ではなくsubscribeHTTP 要求に応答して実行されていることです。リクエストが HTTP 経由の場合は意味がありません。サーバーは、どのソケットが使用されたかわかりません。が機能するためには、ソケット接続を介して、たとえばライブラリのメソッドを使用してリクエストを行う必要があります。req.socketsubscribesocket.getsails.io.js

于 2014-02-13T00:06:27.453 に答える
0

Model クラスをサブスクライブするには、Model.watch(req) を使用する必要があります。次に、publishCreate() ブロードキャストを受け取ります。

http://sailsjs.org/documentation/reference/web-sockets/resourceful-pub-sub/watch

于 2016-08-07T04:57:48.510 に答える