2016-12-26 4 views
1

Iは、ノード/ WSのWebSocketサーバーがlistenしているすべてのクライアントに転送し、それを上、その後のRedisバックプレーン上のメッセージをリッスンし、持っている:のWebSocketは常にバッファとして文字列化されたJSONオブジェクトを送信

sub.on("message", function(channel, message) { 
    console.log('received message from redis: ' + message); 
    console.log('message is type ' + typeof(message)); 
    var stringified = JSON.stringify(message); 
    console.log('stringified is type ' + typeof(stringified)); 

    wss.clients.forEach(function each(client) { 
     client.send(stringified); 
    }); 
}); 

messageがJSONでありますオブジェクト。ログ出力は次のとおりです。クライアントで

received message from redis: {"temp":81} 
message is type object 
stringified is type string 

、私が持っている:

socket.onmessage = function(e) { 
    console.log(e.data) 
    ... 
}; 

をログ出力は次のようになります。

{ "タイプ": "バッファ"、 "データ": [123,34,116,101,109,112,34,58,53,52,125]}

文字列が受信されないのはなぜですか?

は、サーバー上で私がハードコーディングした場合:

client.send('foobar'); 

その後、クライアントコードはログアウトします:

foobarに

+0

ログ出力全体がJSON文字列になる可能性があります。クライアントで 'console.log(typeof e.data)'を試して、それが文字列であることを伝えるかどうか確認してください。また、あなたの質問のタイトルをより意味のあるものにしてください。 – jfriend00

+0

@ jfriend00実際には、 'typeof e.data'は文字列です。私はこれをどのように処理すべきか不明です。なぜ文字列化されたJSONオブジェクトと基本文字列の間に相違がありますか?乾杯。 –

+0

私の問題はRedisからの 'message'です。文字列ではありませんが、' console.log( 'redis:' + message);というメッセージを受け取ったとき、 'toString()'が暗黙的に呼び出されました。私は怠け者で、適切な検査官をつかまえていなかったので、 'console.log'は私に見せなければならなかったものを私に見せていなかった。 –

答えて

2

これは事実に起因するそのソケットのいずれかの種類ベースの通信は、バッファ(より正確には、Unit8Array、TypedArrayの一種)に基づいています。

バッファでtoStringを呼び出して文字列を取得するか、Streamsを使用して受信データに任意の種類の変換を行うことができます。

編集:ところで、console.logバッファを試すと、toStringメソッドが暗黙的に呼び出されます。

+0

これは私の一部ではユーザーエラーだったようですが、あなたは確かに正しいです! –

関連する問題