2011-02-06 10 views
2

私はsocket.ioを使用するNode.jsプロジェクトを持っています。 socket.send(JSON.stringify({'type':'msg','message':'test'}));JSONが正しくシリアル化されていない...と思いますか?

それがサーバーに到着すると、私はそれにJSON.parseを呼び出し、object.type == 'msg'かどうかを確認:その中で、私はこのようなクライアントからサーバにオブジェクトを送信してみてください。コードを実行してconsole.log(object.type)を呼び出すと、"msg"が返されますが、object.type == 'msg'はfalseを返します。何が起きてる?

EDIT:失敗しているコードの

要部である:

client.on('message', function(message, client){ 
    var envelope = JSON.parse(message); 
    console.log(envelope.type); 
    if(envelope.type == "msg") { console.log("yay!"); } 
} 

メッセージが入ってくるたびに、msgyay!印刷ではなく、。

+0

あなたは私達にあなたのサーバコードの一部を表示することができますか?今、私はこれが失敗する理由を考えることはできません。 –

+0

あなたは「... msg、...を返す」と言っていますが、代わりにmsg *を持つオブジェクトを返すべきではありませんか? – Christian

+0

@Ivo @Christian Clarified。 –

答えて

-1

あなたのメッセージは '{"type": "msg"}'の形式である必要があります。

+0

それは...ですか?まあ、他の人の中で... –

0

JSONメッセージの非リテラルをキーとして使用してみましたか? JSONメッセージを使用してsocket.ioを探索する小さなチャットサーバーを構築しています。

クライアント側:ここに私の関連するコードです

var jsonMsg = { 
     action: 'SEND', 
     body: msg, 
     name: name.val() 
    }; 
socket.send(JSON.stringify(jsonMsg)); 

はmsgとname.val()の両方が文字列値であることに注意してください、対応する入力フィールドからつかみました。

サーバー側:

client.on('message', function(m, c) { 
    // parse message 
    var msg = json.parse(m); 

    switch (msg.action) { 
    case 'SEND': 
     // send message to channel 
     var broadCast = { 
     posted: date.toReadableDate(new Date(), 'timestamp'), 
     message: msg.body, 
     name: msg.name 
     }; 
     socket.broadcast(json.stringify(broadCast)); 
     break; 
    } 
}); 

注:toReadableDateは、カスタムプロトタイプの方法です。

メッセージは、ブロードキャストとしてサーバー側とクライアント側で正しく受信されます。

+0

鍵はクライアントによって解析されるので、(適切に)エンコードされているかどうかに違いはありません。 –

+0

使用しているjsonシリアル化ライブラリはどれですか?私の例では、[json2.js](https://github.com/douglascrockford/JSON-js)を使用しています。 – schaermu

+0

両側のV8。別のJSONライブラリを使用すると効率が悪くなります。 –

0

おそらくノードバグでしょうか?私は0.5.0-preで試してみましたが、限られた状況下でうまく動作します。

> message = JSON.stringify({'type':'msg','message':'test'}) 
'{"type":"msg","message":"test"}' 
>  var envelope = JSON.parse(message); 
>  console.log(envelope.type); 
msg 
>  if(envelope.type == "msg") { console.log("yay!"); } 
yay! 

その他のオプションは、(端末上で「MSG」のように見えますが、厳密には、文字列でこれらの文字はない?)エンコーディングの問題かもしれません

関連する問題