我有两个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函数中的行对象返回给我的initdb函数。但是,我可以记录该对象的唯一位置是该函数内。如何传递查询结果,以便可以从server.js发出JSON对象?
请记住,该节点是异步的。因此,在大多数情况下,您是通过回调而不是作为函数的返回值来获取数据的。
您需要将回调链接到查询发生的位置,例如:
// 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
。