【问题标题】:socket.io returns [object Object] from mongojs querysocket.io 从 mongojs 查询返回 [object Object]
【发布时间】:2012-11-15 10:41:21
【问题描述】:

我已经开始使用 mongojs 研究 socket.io 和一些 MongoDB。

总结:客户端不通过 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' 重载是未定义的,这只是我的一些迟钝的错误吗?

【问题讨论】:

    标签: node.js mongodb socket.io mongojs


    【解决方案1】:

    你做错了。乍一看,我发现您的代码中有几个错误。 这里是第一个

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

    您无法以这种方式控制响应内容。您可能会在您的 javascript 调试器中看到 [object Object] 字符串。您必须根据服务器响应作为 json 数据进行此比较。如果它会给你带来麻烦,你可以使用 JSON.parse(response)。

    第二个,您实际上并没有将用户名和密码发送到服务器。你必须使用

    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`
        });
    

    【讨论】:

    • 感谢对 server.js 的帮助,但仍然无法将数据返回到客户端。我需要检查文档中是否有正确的数据以及是否有重定向并设置会话,但是如果我尝试使用 JSON.parse(docs) 我会收到此错误: Uncaught SyntaxError: Unexpected token u localhost:39 (匿名函数) localhost:39 EventEmitter.emit socket.io.js:633 SocketNamespace.onPacket socket.io.js:2248 Socket.onPacket socket.io.js:1930 Transport.onPacket socket.io.js:1332 Transport.onData socket.io.js:1303 stateChange
    • 更新了答案,尝试更新部分并告诉我进展如何。
    • 好吧,我从来没有得到错误的,因为它总是返回一些东西,例如如果我输入 uername: asd 和密码:asd 这就是它返回的内容:xhr-polling writing 5:::{"name":"queryResponse","args":[{"email":"asd","pass":"asd"}]}
    • 这是来自服务器的正确响应。它只是返回一个包含 1 个对象 init 的数组。该对象具有emailpass 字段。我认为服务器响应是正确的。您应该查看侦听事件queryResponse 的客户端脚本。尝试更新。
    • 不太确定我是否理解您的意思:if(response.hasOwnProperty('err')) / /Handle error 什么是“响应”?这是现在的听众:JSFiddle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2013-09-13
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多