0

私はsocket.ioとmongojsを使用したいくつかのMongoDBを見始めました。

概要:クライアントはsocket.ioを介してサーバーにデータを送信しないため、mongojsは検索するものがなく、コレクション内の最初のドキュメントを返すだけです。適切なアクションを実行できるように、nullまたはfalseを返します。node.jsとこれに非常に新しい助けを感謝します。

ログイン機能が必要ですが、ログインするために作成したリンクをクリックすると、クライアントから実行されます。

    <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'のオーバーロードが定義されていないことがわかりましたが、これは私の側からの遅延した間違いですか?

4

1 に答える 1

2

あなたはそれを誤解している。一見すると、コードにいくつかの間違いがあります。ここの最初のもの

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

そのように応答内容を制御することはできません。おそらく[object Object]、JavaScriptデバッガーに文字列が表示されます。この比較は、jsonデータとしてのサーバーの応答に従って行う必要があります。問題が発生する場合は、JSON.parse(response)を使用できます。

2つ目は、実際にはユーザー名とパスワードをサーバーに送信しないことです。あなたは使用する必要があります

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

それ以外の

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

そしてこれを試してみてください

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

のインスタッド

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

そしてあなたのクライアントで次のように応答を確認してください

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`
    });
于 2012-11-15T11:00:40.463 に答える