我有两个node.js文件:server.js和database.js。我希望我的socket.io发生在server.js和database.js中的数据库查询。 Server.js:
// init
io.sockets.on('connection', function(socket) {
initdb = db.initdb();
console.log(initdb)
});
我的database.js基本上包含以下代码:
function query(queryString) {
connection = mysql.createConnection({
host: '12.23.45.67',
user: 'user',
password: 'password',
database: 'database'
});
connection.connect();
var res = connection.query(queryString, function(err, rows, fields) {
if (err) throw err;
});
connection.end();
}
// export initdb for external usage by server.js
exports.initdb = function() {
var initdb = query("SELECT * FROM columns;");
};
我的问题是我希望connection.query函数中的rows对象返回到我的initdb函数。但是,我可以记录此对象的唯一位置是该函数。如何传递查询结果,以便从server.js发出JSON对象?
答案 0 :(得分:4)
请记住,节点是异步的。因此,在大多数情况下,您通过回调而不是函数的返回值来获取数据。
您需要将回调链接到查询发生的位置,例如:
// in database.js
exports.initdb = function(cb) {
query("SELECT * FROM columns", cb)
}
function query(queryString, cb) {
// .. stuff omitted
var res = connection.query(queryString, function(err, rows, fields) {
connection.end();
if (err) return cb(err);
cb(null,rows);
});
// in server.js
io.sockets.on('connection', function(socket) {
db.initdb(function(err,rows) {
if (err) {
// do something with the error
} else {
console.log(rows)
}
});
});
回调是一个带有2个参数err
和rows
的函数。您的server.js代码需要检查err
的值并相应地执行操作,否则它将具有rows
。