浅聊seneca

介绍

使用这个东东也有大半年了,因为seneca-mongo-store(适配seneca框架的mongo数据库操作框架)提供的原生api不大满足业务需求,就要在其中增加几个操作数据库的api接口(分页查询,批量添加,批量修改,聚合查询等),就去拜读了一下seneca的源码!

什么是seneca?

先贴一下代码
浅聊seneca_第1张图片
这是seneca.js主入口 会调用make_seneca函数
浅聊seneca_第2张图片
这个函数 有1600多行 只需要知道返回的是一个seneca对象就可以
浅聊seneca_第3张图片
浅聊seneca_第4张图片
最后将seneca函数贴出来

// Seneca is an EventEmitter.
function Seneca () {
  Events.EventEmitter.call(this)
  this.setMaxListeners(0)
}
Util.inherits(Seneca, Events.EventEmitter)

seneca is an EventEmitter

说白了seneca就是对EventEmitter的封装

下面是对EventEmitter的介绍(node官网直接贴的)

浅聊seneca_第5张图片

再看看seneca如何使用

浅聊seneca_第6张图片
可以从中区分出两个组件
生产者(seneca.add())和消费者(seneca.act())
对应的就是
EventEmitter.on(‘event’, () => {
//生产者
});
EventEmitterr.emit(‘event’);//消费者

seneca-entity介绍

再看看seneca-entity框架(个人理解相当于对外提供的操作数据库的接口规范,就是你要使用seneca框架去操作数据库,就必须按照这个规范去实现这个接口
下面给出解释:
还是先贴代码
会给seneca对象提供make$ 或 make方法
在这里插入图片描述
浅聊seneca_第7张图片
在这里插入图片描述
浅聊seneca_第8张图片
追踪到 Entity函数
浅聊seneca_第9张图片
其中提供了很多的原型方法
浅聊seneca_第10张图片
拿save$方法来说 底层就是调用了 seneca.act()方法
浅聊seneca_第11张图片
贴一段mongo-store 操作数据库的代码例子

var seneca = require('seneca')()
seneca.use('mongo-store', {
  uri: 'mongodb://120.0.0.1:27017/dbname'
})
.use("entity")
 
seneca.ready(function () {
  var apple = seneca.make$('fruit')
  apple.name  = 'Pink Lady'
  apple.price = 0.99
  apple.save$(function (err,apple) {
    console.log( "apple.id = "+apple.id  )
  })
})

var apple = seneca.make$(‘fruit’) 这一步实际上是获得entity对象(操作数据库的对象)

apple.save$(function (err,apple) {
console.log( "apple.id = "+apple.id )
}) 而这一段底层其实调用的是seneca.act()方法

那问题来啦 在哪里提供了对应的seneca.add()方法呢

这就是那些数据库插件要做的工作了,下面用 seneca-mongo-store 来举例说明一下

seneca-mongo-store 介绍

找到入口
浅聊seneca_第12张图片

**seneca.store.init(seneca, opts, store)**这段代码就会去为store生成对应的seneca.add()方法

原生只到native方法,后面的就是我加进去的,当然要想使用这些,在上面
seneca-entity中的Entity对象的原型方法里面也要加上

浅聊seneca_第13张图片

浅聊seneca_第14张图片
再回到 seneca.store对象里

浅聊seneca_第15张图片
instance就是上面seneca.store.init(seneca, opts, store)中传入的seneca对象
浅聊seneca_第16张图片

总结 就是seneca.store对象中的init方法会将mongo-store 中提供的store对象中提供的操作数据库的api 注入到对应的模式中(seneca.add()方法中对应的回调函数),当entity对象调用对应的api方法时(seneca.act()),数据库插件就会接收到信息去处理再返回结果(seneca.add())

最后在指定的位置,我加上了我要封装的操作mongo的api方法

const seneca = require('seneca')({})
    .use("seneca-entity")
let database = require('./db.json')

function Utils() {

}

Utils.init = function(dbName){
    database['name']= dbName
    seneca.use('mongo-store',database)
};

Utils.run= function ({dbName,collectionName},done) {
    Utils.init(dbName);
    let collection = seneca.make(collectionName);
    collection.insertMany$([{name:'haha',age:20},{name:'haha',age:23}],function (err,res) {
        if(err){
            done(err)
        }else{
            done(null,res)
        }
    })
    collection.queryByPage$({name:'haha',limit$:2,sort$:{age:-1}},function (err,res) {
        if(err){
            done(err)
        }else{
            done(null,res)
        }
    })
};

Utils.run({dbName:'static',collectionName:'test'},function (err,res) {
    console.log(err,res)
})

后面就可以在项目中直接拿来用了,可以省一些多余的代码,哈哈

你可能感兴趣的:(nodejs)