考虑到我的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);
};
});
答案 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);
});
});