最简单的形式是,如果一个类是一个类,那么这个类将无法正确返回。
app.js
var Users = require('./users.js');
Users.find('test');
users.js
var Users = function() {
function Users() {
console.log('Users Initiated');
}
Users.prototype.find = function(username) {
console.log(username);
};
return Users;
}
module.exports = Users;
我在控制台中收到的错误
/Users/me/nodejsClassExport/app.js:2
Users.find('test');
^
TypeError: Object function () {
function Users() {
console.log('Users Initiated');
}
Users.prototype.find = function(username) {
console.log(username);
};
return Users;
} has no method 'find'
at Object.<anonymous> (/Users/me/nodejsClassExport/app.js:2:7)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:906:3
如何正确导出它以便可以在不崩溃的情况下使用?
答案 0 :(得分:3)
你是“用户”对象显然是一个函数,一个构造函数。您无法直接从构造函数中获取构造函数原型的方法。但是,您可以创建实例并以这种方式访问原型。
var u = new Users();
u.find(whatever);
编辑 - 现在,回到模块中,你有两个“用户”符号。一个是外部函数,另一个是在其中声明的“Users”函数。但是,您导出的是外部的,并且它的原型上没有“查找”方法。您可以通过调用外部“用户”功能来找到正确的问题来解决此问题。这可以在模块或客户端上下文中完成,但我怀疑你可能在模块中想要它:
module.exports = Users();
答案 1 :(得分:1)
module.exports
对象由Module系统创建。有时这是不可接受的;许多人希望他们的模块成为某个类的实例。为此,请将所需的导出对象指定给module.exports
。请注意,将所需对象分配给exports
只会重新绑定本地exports
变量,这可能不是您想要做的。
所以替换
exports = Users;
与
module.exports = Users;
答案 2 :(得分:0)
此行存在问题:
this.users = nStore["new"]('data/users.db');
要么没有将新对象保存到this.users
,要么它成为异步竞争条件的受害者,因为它抱怨this.users.find()
不存在。
可能是因为nStore
的函数需要回调,因此您必须考虑使用其余代码。
this.users = nStore.new('data/users.db', function () {
console.log('Users Initiated');
// now it is safe to use the methods in 'this.users'
});