这必须是我不熟悉的范围问题。我有一个小模块,我写的是:
(function () {
var getPlanInfo = function (id, conn) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) console.error('Query error: ' + error.stack);
console.log(result[0]); // Everything is great
return result[0];
});
};
modules.exports.getPlanInfo = function (id, conn) { return getPlanInfo(id, conn); // Typo }
})();
这就是问题所在。当我从任何地方(模块本身或其他文件内)调用它时,返回值始终是未定义的。我在函数内部检查,查询返回预期的结果。
var backend = require('./module.js');
var t = backend.getPlanInfo();
t是undefined
。如果我从模块内部调用该方法(该模块中的另一个函数),这是相同的。
我熟悉javascript中的回调原则以及如何将对象和函数作为参数传递以保持在范围内。这是问题还是这个node.js的特殊性?
我在开发者控制台(Chrome)中尝试过,按预期工作。
答案 0 :(得分:2)
conn.query()
看起来像是异步的。因此,您无法从getPlanInfo()
返回其结果,因为getPlanInfo()
在结果可用之前很久就会返回。从result[0]
回调中返回conn.query()
只会将一段数据返回到conn.query()
基础结构中。 getPlanInfo()
早已回归。
如果您想要异步结果,则必须更改getPlanInfo()
以使用支持获取异步结果的机制,例如直接回调或承诺或类似内容。
这是一种简单的回调方式:
var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}
console.log(result[0]); // Everything is great
callback(0, result[0]);
});
};
modules.exports.getPlanInfo = getPlanInfo;
然后,该模块的调用者将如下所示:
var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});
答案 1 :(得分:1)
您不会从getPlanInfo
返回任何内容。可能你想写modules.exports.getPlanInfo = function (id, conn) { return getPlanInfo; }
(使用return getPlanInfo;
代替return getPlanInfo();
)