2012-11-15 3 views
0

나는 socket.io와 mongojs를 가진 MongoDB를 살펴보기 시작했습니다.socket.io는 mongojs 쿼리에서 [object Object]를 반환합니다.

요약 : 클라이언트가 socket.io를 통해 서버로 데이터를 보내지 않으므로 mongojs가 검색 할 항목이 없으며 컬렉션의 첫 번째 문서 만 반환합니다. null 또는 false를 반환하여 가져올 수 있도록하고 싶습니다. 알맞은 행동. 모든 도움을 주셨습니다. node.js와 this를 매우 신중하게 사용하십시오.

나는 기능에 로그가 필요하지만이 로그인을 내가 만들어 놓은 링크를 클릭하면 클라이언트에서 실행해야합니다

<script> 
     var socket = io.connect('http://localhost:13163'); 

     socket.on('connect', function() { 
      socket.emit(console.log('Client connected')); 
     }); 
     socket.on('queryResponse', function (res, err) { 
      if (res == "[object Object]") { 
       console.log('EMPTY OBJ SERVER: ' + res + ' ' + err); 
      } 
      else{ 
       console.log('IF NOT EXEC' + res[0].email) 
      } 
     }); 
     //socket.send('client hello'); 
     //pageload 
     $(function() { 
      $('#login').click(function() { 
       var username = $('#username').val(); 
       var password = $('#password').val(); 
       if (!username || !password) { 
        event.preventDefault(); 
        console.log('Need data in both fields'); 
       } 
       else { 
        event.preventDefault(); 
        socket.emit('querydata', function (username, password) { 
         console.log("CLIENT: Querying server for data..."); 
        }); 
       } 
      }); 
     }); 
    </script> 

이 서버에 사용자 이름과 암호를 전송해야하는해야 다음을 실행하십시오 :

socket.on('querydata', function (user_username, user_password) { 
    db.users.find({email: user_username, pass: user_password}, function (err, docs) { 
     if (err || !docs) { 
      socket.emit('queryResponse', 'No users found', err); 
      console.log('if - ' + docs[0].email); 
     } 
     else { 
      socket.emit('queryResponse', docs); 
      console.log('else - ' + docs[0].email + 'user_password' + user_password + 'user_username' + user_username); 
     } 
    }); 
}); 

이상한 점은 컬렉션의 첫 번째 문서 만 찾습니다. 'user_username'과 'user_password'오버로드가 정의되지 않았 음을 알았습니다. 내 편이 약간 지연된 실수입니까?

답변

2

잘못하고 있습니다. 처음에는 코드에 몇 가지 실수가 있습니다. 여기

if (res == "[object Object]") 

첫 번째는 당신이 그런 식으로 응답 콘텐츠를 제어 할 수 없습니다. 자바 스크립트 디버거에 [object Object] 문자열이 표시됩니다. json 데이터로 서버 응답에 따라이 비교를 수행해야합니다. 문제가 발생하면 JSON.parse (응답)를 사용할 수 있습니다.

둘째, 실제로 서버에 사용자 이름과 암호를 보내지 마십시오. 당신은

등의 반응을 확인하는 대신

socket.emit('querydata', function (username, password) ... 

socket.emit('querydata', { username: username, password: password }, function (data) { 
    // Server Ack here 
} 

을 사용하고

socket.emit('queryResponse', 'No User Found', err); 

의 그리고 클라이언트에서이

socket.emit('queryResponse', {err: 'No User Found'}); 

instad을 시도해야

if(response.hasOwnProperty('err'))//Handle error 

고객 측에서는 고객 번호 queryResponse 수신기를 사용해보십시오.

socket.on('queryResponse', function (res) { 
     if(res.hasOwnProperty('err'))/Handle Error 
     else // You have an array in `res` 
    }); 
+0

server.js를 도와 주셔서 감사합니다. 데이터를 클라이언트로 다시 가져 오는 데 문제가 있습니다. 문서에 올바른 데이터가 있는지 확인하고 리디렉션하고 세션을 설정했지만 JSON.parse (docs)를 사용하려고하면이 오류가 발생합니다. Uncaught SyntaxError : 예기치 않은 토큰 u localhost : 39 (익명 함수) 로컬 호스트 39 EventEmitter.emit의 socket.io.js : 633 SocketNamespace.onPacket의 socket.io.js : 2,248 Socket.onPacket의 socket.io.js : 1,930 Transport.onPacket socket.io.js : 1332 Transport.onData socket.io.js : 1303 stateChange – mackwerk

+0

답변을 업데이트하고 업데이트 된 부분을 시도해보고 어떻게되는지 알려주세요. –

+0

글쎄, 내가 잘못 입력 한 적이 없다. 왜냐하면 내가 uername : asd와 password를 입력하면 항상 예를 ​​들어 반환하기 때문이다 : asd 이것은 다음과 같이 반환한다 :'xhr-polling writing 5 ::: { "name": "queryResponse" "args": [{ "email": "asd", "pass": "asd"}]} ' – mackwerk

관련 문제