应用内 Waterline 实例的共享

撰写于 2016年5月13日 修改于 2021年3月11日 分类 编程杂记 标签 Node.js / Waterline

相对于 Mongoose 的初始化来讲,Waterline 的要麻烦得多,首先 Waterline 的初始化是异步的,其次,它是返回一个全新的对象,所以不得不使用单独的代码,来解决应用内共享同一个数据库的 models 。在 Express 项目中使用 Waterline一文中,我们是将所有的集合加载到 Express 的实例中,网友 wuwanyu 问道,还有没有其它的办法,让应用内能够更方便的共享 Waterline 实例。

在 Node.js 中,模块是单例模式共享的,所以可以利用这一特性来在应用内共享 Waterline 实例。下面的代码依然是基于 waterline-sample

首先,为了程序的可读性,我们在 config/waterline.js 的最后一行,增加一个导出的变量,用以存放 waterline 中所有 models 的引用,将其初始化为 null

1
2
3
exports.orm = orm;
exports.config = wlconfig;
exports.models = null;

接着,在初始化的时候,将其赋值,修改 bin/www 相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env node

var app = require('../app');
var config = require('../config/config');
var waterline = require('../config/waterline');

waterline.orm.initialize(waterline.config, function(err, models){
// ...
waterline.models = models.collections;
// app.set('models', models.collections);
// ...
});

以后,直接使用 config/waterline.js 中导出的 models 即可进行 Waterline 的相关操作了,比如,在控制器中,可以这样操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var waterline = require('../../config/waterline');
module.exports = {
list: function(req, res, next){
var page = parseInt(req.query.page, 10) ? parseInt(req.query.page, 10) : 1;
var limit = parseInt(req.query.limit, 10) ? parseInt(req.query.limit, 10) : 1;
// req.models.post
waterline.models.post
.find()
.paginate({page: page, limit: limit})
.exec(function(err, docs){
res.json(docs);
});
}
};

同理,其它所有需要在应用内进行共享的数据,都可以通过 Node.js 模块的单例特性来实现。

目录

Site by Stiekel using Hexo & Random
© 2010 - 2023

Hide