我在调用模块中的方法时遇到问题。
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
在我的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;
});
});
}
};
};
答案 0 :(得分:5)
您正在导出User
作为工厂函数,该函数返回一个带有getAddress
方法的对象。所以你需要先调用(实例化)User
:
var useraddress = usr.User().getAddress(id, pool);
另一个重要问题。 connection.query
请求是异步的,这意味着将getAddress结果分配给var useraddress
没有意义。相反,您需要将回调传递给getAddress
或使用Promise模式(请查看此帖子以获取有关该主题的大量详细信息:How do I return the response from an asynchronous call?)。
在你的情况下,我认为这样的事情是最简单的工作方法:
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);
});
});
}
};
};
和用法:
usr.User().getAddress(id, pool, function(result) {
console.log('Loaded', result);
});
答案 1 :(得分:1)
这是因为usr.User
上没有.getAddress
属性。
要将.getAddress
用作属性,您需要将User导出为对象。
exports.User = {
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;
});
});
}
};
};
现在确实如此。