从模块函数返回未定义的对象
Returned object undefined from module function
这一定是我不熟悉的范围问题。我有一个小模块,我写的就是这样:
(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 中的回调原则,以及如何将对象和函数作为参数传递以保持在范围内。这是这里的问题还是节点.js特殊性?
我在开发人员控制台(Chrome)中尝试了,按预期工作。
>conn.query()
看起来像是异步的。 因此,您无法从 getPlanInfo()
返回其结果,因为getPlanInfo()
在结果可用之前很久就返回。 从conn.query()
回调返回result[0]
只是将一段数据返回到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
}
});
您不会从 getPlanInfo
返回任何内容。可能你想写modules.exports.getPlanInfo = function (id, conn) { return getPlanInfo; }
(用return getPlanInfo;
代替return getPlanInfo();
)
相关文章:
- 在CoffeeScript文件上运行Jasmine测试时,对象未定义错误
- JavaScript 对象 - 未定义的数字键文字
- 为什么页面方法对象未定义
- JavaScript对象表示嵌套对象未定义
- Javascript类构造的对象未定义
- JQuery TypeError:对象未定义(length=object.length,)
- 用于从许多带有“for”循环的URL中获取HTML信息的X射线使对象未定义
- 如何避免收到一条消息,指出对象未定义
- JavaScript 对象未定义
- JavaScript 对象未定义它是否在几年前工作
- 揭示模块模式:对象未定义
- 对象未定义/HTML使用jQuery输出
- 为什么子 html 对象未定义/空
- 提取 JSON 对象未定义
- 为什么这个带有最简单的构造函数的 javascript 对象未定义
- “对象”未定义日历.js
- 对象未定义到模块中,Nodejs javascript
- javascript对象未定义
- Twilio响应对象未定义,但没有错误
- 为什么"对象未定义”;在这种情况下没有抛出错误