应用内 Waterline 实例的共享
    
      撰写于 2016年5月13日
      
        修改于 2017年6月27日
      
      
      分类
      
      
        
        
        编程杂记
      
      
      
      
      
      标签
      
      
        
        
        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;       });
 | 
以后,直接使用 config/waterline.js 中导出的 models 即可进行 Waterline 的相关操作了,比如,在控制器中,可以这样操作:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14
 | 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;          waterline.models.post     .find()     .paginate({page: page, limit: limit})     .exec(function(err, docs){       res.json(docs);     });   } };
 | 
同理,其它所有需要在应用内进行共享的数据,都可以通过 Node.js 模块的单例特性来实现。