用于声明模型的Clean方法



我有一个使用express、orm和sqlite3的节点项目。

我有多种型号。目前,每种型号的声明都与此类似:

var orm = require('orm');
var db = orm.connect({database: ':memory:', protocol: 'sqlite'});
var schema = db.define('service', {
    uptime: Number,
    // ...
});
db.sync(function (err) {
    !err && console.log("db synced!");
});
module.exports = schema;

在十几种型号中,重复要求和连接并不是特别令人愉快。

我想把它整理一下,这样我就可以在app.js中连接,然后加载模型并像在路由中一样使用它们。但是我不能让它工作。这就是我正在做的:

首先,我在app.js:中定义了连接并定义了模型

var service;
orm.connect(app.get('db-opt'), function(err,db){
    !err && console.log("db connected!");
    if (err){
        throw err;
    }
    db.load('./models', function(err){
        app.service = service = db.models.service;
        !err && console.log("models loaded!");
    });
    db.sync(function(err){
        !err && console.log("db synced!");
    });
});

models/index.js文件看起来像:

module.exports = function(db,fn){
    db.define('service', {
        uptime: Number,
        // ...
    });
    return fn();
};

routes/services.js看起来像:

var services = [];
exports.list = function(service){
    return function(req, res){
        service.find({}, function(err, services){
            if (err){
                return next(err);
            }
            res.render('services', {
                title: 'Services',
                services: services
            });
        });
    };
};

最后,我在app.js:中连接了这样的路线

app.get('/services', services.list(service));

我收到了预期的控制台消息,但当我尝试访问时,我收到了以下错误:TypeError: Cannot call method 'find' of undefined

我已经尝试将app.servicemodels.service传递到service.list,但两者都不起作用,给出了相同的错误。

如何干净地加载模型,并使它们能够访问需要它们的路由?

更新:我可以证明db.load调用使用以下代码:

db.load('./models', function(err){
    var services = [];
    service = db.models.service;
    service.find({}, function(err, services) {
        if (err){
            throw err;
        }
    });
    !err && console.log("models loaded!");
});

因为这会产生Error: SQLITE_ERROR: no such table: service

我似乎很接近。我的假设是,app.get('/', services.list(service));在被调用时,将使用服务中的任何值进行调用。因此,尽管在orm.connect的回调之前(可能)执行了app.get(...),但在http.createServer(app)之后,所有内容都将被正确解析。并非如此。

app.get(..)移到orm.connect回调中会使其工作。

因此:

// define models
var db = orm.connect(app.get('db-opt'), function(err,db){
    !err && console.log("db connected!");
    if (err){
        throw err;
    }
    db.load('./models', function(err){
        app.service = db.models.service;
        !err && console.log("models loaded!");
    });
    db.sync(function(err){
        !err && console.log("db synced!");
    });
    app.get('/', services.list(app.service));
    // ...
});

虽然这是我将要使用的方法,但有人能看到不同的方法吗?

相关内容

最新更新