2011-02-06 7 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를 반환합니다. 무슨 일 이니?

편집 :

실패 코드의 관련 부분은 다음과 같습니다

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"처럼 보이지만 엄격하게 문자열에 해당 문자 아닌가요?)