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

时间:2012-04-11 09:33:11

标签: node.js orm models

我正在测试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导出模型的正确方法是什么?这可能很简单,但我在文档中找到了任何内容......

2 个答案:

答案 0 :(得分:4)

您的问题是您在回调函数中设置了module.exports。节点的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()回调的一部分完成。

答案 1 :(得分:0)

我是如何使用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。你也可以看一下光明: https://npmjs.org/package/light-orm