【问题标题】:Node.js client.emit only working after first try?Node.js client.emit 仅在第一次尝试后才有效?
【发布时间】:2013-08-11 19:23:23
【问题描述】:

我正在编写一个应用程序,我有一个用户通过电子邮件和密码登录。如果登录正确,我的 node.js 服务器会返回“是”或“否”。

在服务器上,我可以控制台记录结果并每次查看。但是,client.emit 命令仅在第一次之后才有效。并且仅当输入的“电子邮件”和“密码”在这两个时间都相同时。因此,客户端上的警报仅在第二次之后触发。

这是我的服务器代码:

client.on('checkcred', function(email, password){
        helper.check(email, password,function(run){
        client.emit('conf',run);
        console.log(run);
                });
        });

helper.js

exports.check = function(zmail, pasword,callback){

                client.query('SELECT id FROM passwords WHERE email="'+zmail+'"', function(err,data){

                 if(data.length == 0){
                console.log("wrong email");
                callback("no");
                }else{
                        var savedemail = data[0].id;
                        client.query('SELECT password FROM passwords WHERE id='+savedemail+'', function(err,pass){
                                var databasepass = pass[0].password;

                                if (pasword == databasepass){
                                        console.log("correct pass");
                                        callback("yes");
                                }else{
                                        console.log("incorrectpass");
                                        callback("no");
                                }
                        });
                }
     });
                }

客户

 var socket  = io.connect('http://54.213.92.113:8080');

            socket.on('conf', function (yn) {
                      alert(yn);
                      });

 function upload(email, password){

            //check the email and password against the saved email and pass.
            socket.emit('checkcred', email, password);

        }

非常感谢任何帮助!

【问题讨论】:

  • 您已经向 SQL 注入攻击敞开了大门。不要将数据连接到数据库查询中!
  • 好的,那我该如何获取mysql数据呢?这就是我遇到问题的原因?
  • 不,和你的问题无关,但是SQL注入攻击是个严重的问题。您可以在en.wikipedia.org/wiki/SQL_injection 阅读更多内容。为防止这种情况,请始终在输入中转义引号(单引号和双引号)。

标签: javascript mysql node.js socket.io


【解决方案1】:

你必须像这样将你的 socket.on('conf') 包装到一个 onConnection 回调中:

io.sockets.on('connection', function (socket) {
    socket.on('conf', ...)
}

【讨论】:

  • 我建议您忽略服务器端的所有数据库查询,只需执行socket.emit('conf', ...) 即可查看效果
  • 它确实有效。当我将该代码移到函数之外时,它可以正常工作。我认为出了点问题,因为我在彼此之间拥有多个功能?
  • 不,保持client.on 代码不变,并将exports.check 代码更改为callback("yes")。试试这个,看看它是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多