如何使用 node-orm 导出模型?

Posted

技术标签:

【中文标题】如何使用 node-orm 导出模型?【英文标题】:How to exports models with node-orm? 【发布时间】:2012-04-11 09:33:11 【问题描述】:

我正在测试node-orm,但找不到导出模型的正确方法。这是模型定义(./models/user.js):

var orm = require('orm');

var db = orm.connect('pg://user@localhost/accounts', function(success, db) 
  if (!success) 
    console.log('Could not connect to database.');
    return;
  

  var User = db.define('user', 
    ... // Model schema
  );

  module.exports = User;
);

当我尝试在其他地方使用它时(例如 ./app.js):

var User = require('./models/user');
...

app.get('/test', function(req, res) 
  var user = new User(
    ...
  );
  user.save(function(err, user) 
    ...
  );

  ...
);

原来 User 是一个空对象,所以节点不能调用模型构造函数。使用 node-orm 导出模型的正确方法是什么?这可能很简单,但我可以在文档中找到任何内容……

【问题讨论】:

【参考方案1】:

您的问题是您在回调函数中设置了module.exports。 Node 的 module loading system 明确指出你不能这样做。

orm-node 模块将您的模型以您为模型指定的名称存储在其模块导出中。如果您将 app.js 更改为阅读,您的示例应该可以工作:

require('./models/user');
var orm = require('orm');
...

app.get('/test', function(req, res) 
  var user = new orm.user(
    ...
  );
  user.save(function(err, user) 
    ...
  );

  ...
);

还请注意,由于您的模型是在回调中初始化的,因此在您 require() 您的模型模块之后不会立即可用。在您需要处理 /user 的获取之前,您可能已经完成了数据库连接和模型初始化。

处理这一切的最安全方法可能是确保您的应用程序初始化和listen() 作为orm.connect() 回调的一部分完成。

【讨论】:

好的,谢谢,现在效果更好了。回调的问题是我想将我的模型分隔在不同的文件中。我可能可以将我的模型定义放在不同的文件中,然后在回调中导入它们……【参考方案2】:

这就是我使用light-orm 的方式:

var ORM = require('light-orm');

var AdsCollection = new ORM.Collection(
    connector: ORM.driver,
    tableName: 'ads'
);

module.exports = AdsCollection;

应该与您的 ORM 非常相似。由于魔术问题和复杂性,我已从 node-orm 迁移到 light-orm。你也可以看看 light-orm: https://npmjs.org/package/light-orm

【讨论】:

以上是关于如何使用 node-orm 导出模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node-orm2 通过 Express 对两个或多个数据库进行建模?

node-orm2 获取唯一出现次数?

将每个与 node-orm2 一起使用的通用回调

如何使用 export_savedmodel 函数导出 Estimator 模型

如果文件未导出,如何使用在单独文件中定义的猫鼬模型?

如何对从搅拌机导出的动画 js 模型进行纹理处理? [三.js]