方法名称不是函数

jem*_*emz 3 javascript module node.js

我在调用模块中的方法时遇到问题.

There is an errorTypeError: usr.User.getAddress is not a function

我不知道如何解决这个问题我觉得我的模块代码有问题.我想得到地址或结果.

在我的main.js

var mysql = require('mysql');
var usr = require('./user');

  var useraddress = usr.User.getAddress (id,pool); //this is how I access the method
Run Code Online (Sandbox Code Playgroud)

在我的user.js中

exports.User = function () {

    return {
        getAddress: function (userid, pool){
            pool.getConnection(function (err, connection) {
                var options = {
                    sql: " select address from user where id = ?
                };

                var querypos = connection.query(options, [userid], function (err, results) {
                    if (err) throw err;


                });

            });
        }
   };

};
Run Code Online (Sandbox Code Playgroud)

dfs*_*fsq 5

您将导出User为工厂函数,该函数返回带有getAddress方法的对象.所以你需要先调用(实例化)User:

var useraddress = usr.User().getAddress(id, pool);
Run Code Online (Sandbox Code Playgroud)

另一个重要问题.connection.query请求是异步的,这意味着分配getAddress结果var useraddress是没有意义的.相反,您需要将回调传递给getAddress或使用Promise模式(请查看此帖子以获取有关该主题的大量详细信息:如何从异步调用返回响应?).

在你的情况下,我认为这样的事情是最简单的工作方法:

exports.User = function () {
    return {
        getAddress: function (userid, pool){
            pool.getConnection(function (err, connection) {
                var options = {
                    sql: "select address from user where id = ?"
                };

                var querypos = connection.query(options, [userid], function (err, results, callback, errCallback) {
                    if (err) {
                      errCallback(err);
                    }
                    callback(results);
                });
            });
        }
   };
};
Run Code Online (Sandbox Code Playgroud)

和用法:

usr.User().getAddress(id, pool, function(result) {
    console.log('Loaded', result);
});
Run Code Online (Sandbox Code Playgroud)