从模块函数中返回的对象未定义

时间:2015-03-12 22:18:33

标签: javascript node.js

这必须是我不熟悉的范围问题。我有一个小模块,我写的是:

(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)中尝试过,按预期工作。

2 个答案:

答案 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();