我正试图以这种方式导出一个函数:
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
。
提前致谢!
答案 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/