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

Javascript 从模块函数返回的对象未定义,javascript,node.js,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);

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

(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是未定义的。如果我从模块本身(该模块中的另一个函数)内部调用该方法,情况也是如此

我熟悉javascript中的回调原理,以及如何将对象和函数作为参数传递以保持在范围内。这是这里的问题还是node.js


我在开发者控制台(Chrome)中试过,效果与预期一样。

您不会从
getPlanInfo
返回任何内容。可能您想编写
modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}


(使用
返回getPlanInfo;
而不是
返回getPlanInfo();

您不会从
返回任何内容。可能您想编写
modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}


(使用
返回getPlanInfo;
而不是
返回getPlanInfo();

您不会从
返回任何内容。可能您想编写
modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}


(使用
返回getPlanInfo;
而不是
返回getPlanInfo();

您不会从
返回任何内容。可能您想编写
modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}

(使用
返回getPlanInfo;
而不是
返回getPlanInfo();

连接查询()
看起来是异步的。因此,您不能从
getplannifo()
返回其结果,因为
getplannifo()
早在结果可用之前就返回了。从
conn.query()
回调返回
result[0]
只会将一段数据返回到
conn.query()
基础结构中<代码>getPlanInfo()
早就返回了

如果需要异步结果,则必须更改
getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等

下面是一种简单的回调方法:

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
    }
});
conn.query()
看起来是异步的。因此,您不能从
getplannifo()
返回其结果,因为
getplannifo()
早在结果可用之前就返回了。从
conn.query()
回调返回
result[0]
只会将一段数据返回到
conn.query()
基础结构中<代码>getPlanInfo()
早就返回了

如果需要异步结果,则必须更改
getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等

下面是一种简单的回调方法:

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
    }
});
conn.query()
看起来是异步的。因此,您不能从
getplannifo()
返回其结果,因为
getplannifo()
早在结果可用之前就返回了。从
conn.query()
回调返回
result[0]
只会将一段数据返回到
conn.query()
基础结构中<代码>getPlanInfo()
早就返回了

如果需要异步结果,则必须更改
getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等

下面是一种简单的回调方法:

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
    }
});
conn.query()
看起来是异步的。因此,您不能从
getplannifo()
返回其结果,因为
getplannifo()
早在结果可用之前就返回了。从
conn.query()
回调返回
result[0]
只会将一段数据返回到
conn.query()
基础结构中<代码>getPlanInfo()早就返回了

如果需要异步结果,则必须更改
getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等

下面是一种简单的回调方法:

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

我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。这可能有助于他们调用所需函数,但无法解决返回结果的问题。这可能有助于他们调用所需函数,但无法解决返回结果的问题。这可能有助于他们调用所需函数,但这不能解决返回结果的问题。这可能有助于他们调用所需的函数,但不能解决返回结果的问题。