如何正确导出/要求

时间:2014-07-23 11:19:14

标签: node.js

我正试图以这种方式导出一个函数:

exports.query = function(request){
    conn.query(request, function(err, rows, fields){
        if(err) console.log(err);
        return rows[0].id;
    });
}

并使用它:

var mysql = require('./mysql');
console.log(mysql.query('SELECT * FROM tablename'));

以此方式获取结果需要undefined作为输出。 我该如何解决这个问题?

请注意,当我只输入console.log(rows[0].id)而不是return rows[0].id时,它会发回123

提前致谢!

2 个答案:

答案 0 :(得分:2)

在您的示例中,输出将返回到数据库查询的匿名函数,而不是模块的调用者。您可以使用回调将输出返回给模块的调用者。

exports.query = function(request, callback){
    conn.query(request, function(err, rows, fields){
        if (err) {
            callback(err);
        } else {
            callback(null, rows[0].id);
        }
    });
}

然后将其称为

var mysql = require('./mysql');
mysql.query('SELECT * FROM tablename', function(err, results){
    if (err) {
        console.error(err);
    } else {
        console.log(results);
    }
});

答案 1 :(得分:0)

这是一个同步问题。

conn.query函数返回undefined,因为它在获取结果之前完成了它的执行(就像js / node上几乎所有与i / o相关的操作一样)。

一种可能的解决方案是向query函数提供回调。

exports.query = function(request, cb){
  conn.query(request, function(err, rows, fields){
    // some "special" processing
    cb(err, rows, fields);
  });
};

如果您不熟悉异步功能,请查看一些有关该功能的文章:

http://justinklemm.com/node-js-async-tutorial/  https://www.promisejs.org/

相关问题