Node.js + socket.io + MySQL语法修正

时间:2015-12-16 11:55:32

标签: node.js socket.io

考虑到我的server.js看起来几乎就是这样。只需向您发送相关部分即可。我没有从查询中收到任何内容,我在数据库中有数据,并且“sendNotification”由客户端中的jQuery函数触发。一切正常,因为var notis = [];返回一个空值,显示为响应。我知道我必须调试SQL,这就是我要做的事情,但无论如何都要确定其他事情。所以我的问题是:

1)考虑到这种异步行为,是node.js的正确语法吗? (我还是不明白)

2)查询总是应该在“io.sockets.on('connection')”部分内?

connection = mysql.createConnection({
host: 'localhost',
user: '',
password: "",
database: 'table' //put your database name
}),

...

connection.connect(function(err) {
// connected! (unless `err` is set)
console.log(err);
});

…

var sqlquery = function(uID,vs){
var notis = [];
connection.query("SELECT * FROM notification WHERE kid = ? AND v = ? ORDER BY id DESC",[uID,vs])
.on("result", function (data){
    return notis.push(data);
});
};


 io.sockets.on('connection', function(socket) {
 ...
socket.on("sendNotification", function(data) {
    var roomBName = data.room_name.replace("room-",""),
        found = [];

        var roomSelected = _.find(rooms, function (room) { return room.id == roomBName });


        for (var person in people) {
            for (var i = 0, numAttending = roomSelected.peopleAttending.length; i < numAttending; i++) {

                if (people[person].name == roomSelected.peopleAttending[i]) {

                    found.push(person);
                }
            }
        }

        for (var i = 0, numFound = found.length; i < numFound; i++) {


            **result = sqlquery(9,2);**


            io.to(found[i]).emit('notification', result);
        };

});

2 个答案:

答案 0 :(得分:0)

您的sqlquery()函数无法完成任何有用的操作。因为connection.query()是异步的,这意味着它会在sqlquery()完成后的某个时间提供响应。

node.js中使用异步结果的唯一方法是在提供它的回调中实际使用它。你不要把它放到其他变量中,并期望在其他代码中为你提供结果。相反,您在回调中使用它,或者从回调中调用其他函数并将数据传递给它。

在某种程度上,您可以更改sqlquery()功能:

var sqlquery = function(uID, vs, callback){
    connection.query("SELECT * FROM notification WHERE kid = ? AND v = ? ORDER BY id DESC",[uID,vs])
    .on("result", function (data){
        callback(null, data);
    });
    // need to add error handling here if the query returns an error
    // by calling callback(err)
};

然后,你可以像这样使用sqlquery函数:

    found.forEach(function(person, index) {
        sqlquery(..., function(err, result) {
            if (err) {
                // handle an error here
            } else {
                io.to(person).emit('notification', result);
            }
        });
    });

而且,看起来您可能在其他地方也有类似的异步问题,就像在connection.connect()中一样。

答案 1 :(得分:0)

除了@ jfriend00之外,还可以使用新的ES6功能Promise来完成:

var sqlquery = function(uID, vs){
    return new Promise(function(resolve, reject){
        connection.query("SELECT * FROM notification WHERE kid = ? AND v = ? ORDER BY id DESC",[uID,vs])
        .on("result", function (data){
            resolve(data);
        });
    });
};

现在您可以使用它:

found.forEach(function(person, index) {
    sqlquery(...)
    .then(function(result){
        io.to(person).emit('notification', result);
    });
});