如何在Node.js中导出JavaScript类?

时间:2014-08-23 14:33:55

标签: javascript node.js

最简单的形式是,如果一个类是一个类,那么这个类将无法正确返回。

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

如何正确导出它以便可以在不崩溃的情况下使用?

3 个答案:

答案 0 :(得分:3)

你是“用户”对象显然是一个函数,一个构造函数。您无法直接从构造函数中获取构造函数原型的方法。但是,您可以创建实例并以这种方式访问​​原型。

var u = new Users();
u.find(whatever);

编辑 - 现在,回到模块中,你有两个“用户”符号。一个是外部函数,另一个是在其中声明的“Users”函数。但是,您导出的是外部的,并且它的原型上没有“查找”方法。您可以通过调用外部“用户”功能来找到正确的问题来解决此问题。这可以在模块或客户端上下文中完成,但我怀疑你可能在模块中想要它:

module.exports = Users();

答案 1 :(得分:1)

来自the documentation

  

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