将node.js-mysql返回给函数

时间:2014-01-14 20:42:06

标签: javascript json node.js socket.io node-mysql

我有两个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对象?

1 个答案:

答案 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个参数errrows的函数。您的server.js代码需要检查err的值并相应地执行操作,否则它将具有rows