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

Returned object undefined from module function

本文关键字:对象 未定义 返回 模块 函数      更新时间:2023-09-26

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

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