一、基本用法
- vppjs 是一个基于 VSOA 的开发框架,在 VSOA 原有的功能上进行二次抽象,这些强健且友好的 API 使得 VSOA 服务开发变得快速又简单,开发者按照框架的规范进行不同配置就可以实现不同的需求,vppjs 框架和大家熟悉的 Express 类似,开发者可以比较容易上手。
- vppjs 提供了两个 API ,用于创建 Vpp 实例(以下简称 vpp)和 VppRouter 实例(以下简称 router),vpp 负责对 VSOA 应用的生命周期的管理,router 的作用是为了方便我们更好的根据路由去分模块,避免将所有路由都写在入口文件中。值得注意的是,目前 vpp 或 router 暂时不能使用任意的 (req, res, nex) => {} 的中间件功能。
- Vpp:
const vppjs = require('vppjs');
const vpp = vppjs.vpp();
- 当客户端连接或断开的时候,vpp 可以监听到 connect 和 disconnect 事件:
vpp.on('connect', (cli, server) => {
console.log('client connected');
})
vpp.on('disconnect', (cli, server) => {
console.log('client disconnected');
})
- 完成一些服务信息、密码、TLS 等基本配置的初始化:
const vpp = vppjs.vpp({
info: {
name: 'Vpp.js',
version: '1.0.0',
description: ' Vpp.js is a vsoa server framework like express ',
},
passwd: 'myPassword',
});
- 启动 VSOA 服务,等待 VSOA 客户端的连接:
vpp.start(9999, (cli, server) => {
console.log('server started');
});
vpp.stop(() => {
console.log('server stopped');
});
- VSOA 服务端可以识别某个主题是否被客户端所订阅,并且将某个主题的消息同时推送到已订阅该主题的所有客户端上。假如工厂中有一批机器人,一部分负责生产、一部分负责搬运,还有一部分负责清洁,可以通过一下简单的配置对机器人进行批量设置,让它们各司其职:
if (vpp.isSubscribed('/config/carry')) {
console.log('/config/carry is subscribed');
publishCarryConfig();
} else {
setTimeout(() => {
if(vpp.isSubscribed('/config/carry')) {
console.log('/config/carry is subscribed');
publishCarryConfig();
}
}, 2000);
}
function publishCarryConfig() {
const fileBuf = fs.readFileSync(path.join(__dirname, 'config', 'carry.json'));
vpp.publish({
data: fileBuf }, true, '/config/carry');
}
二、Router
- vpp 和 router 使用中间件的注意事项,vpp 和 router 进行以下操作是不被允许的:
const vppjs = require('vppjs');
const router = vppjs.router();
router.use((req, res, next) => {
console.log('middleware');
next();
});
- router 的设计和 Express 的 Router 风格类似, 把相关的业务拆分开,方便开发和后期维护,实现高内聚低耦合。比如用户管理都在userRouter,订单管理都在 orderRouter,这样就可以多人合作开发,每个功能相对独立。vppjs 遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。vppjs 资源访问的方法包括 use、get、dgram、publish。
- 以 dgram 为例,会发现代码实现变得比较简单和规范:
router.dgram('/name', (req, res) => {
console.log('/user/name:',req.payload);
return res.datagram({
param: 'welcome' });
});
vpp.use('/user', router);
client.datagram('/user/name', {
param: {
path: '/user/name',
name: 'zhangsan',
}
})
- vppjs 是基于 VSOA 的实现的一个应用框架,使用者了解 VSOA 的资源访问方式和熟悉 express 应该比较容易上手,使用 vppjs 应用框架开发 VSOA 应用,会使得开发变得更加简单和友好,对资源的访问遵守一定的原则,使得代码风格也比较规范。