4

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

4

2 回答 2

4

您的问题是您正在设置module.exports回调函数。Node 的模块加载系统明确指出你不能这样做。

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()回调的一部分完成。

于 2012-04-12T04:29:35.607 回答
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 。您也可以查看 light-orm: https ://npmjs.org/package/light-orm

于 2014-01-29T22:26:44.403 回答