爱智EdgerOS之深入解析用vppjs应用框架开发VSOA应用

一、基本用法

  • 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) => {
    
    
  // do something
  console.log('client connected');
})

vpp.on('disconnect', (cli, server) => {
    
    
  // do something
  console.log('client disconnected');
})
  • 完成一些服务信息、密码、TLS 等基本配置的初始化:
/**
 * info {String|Object} , 对于 VSOA 服务器信息,默认 'Vpp.js'
 * passwd {String} , VSOA 服务身份验证的密码
 * tlsOpt {Object},Node.js TLS 选项对象,用于 VSOA TLS 服务器设置
 * defaultErrorCode {Number},范围从 128 到 255,默认 199。
 * 默认错误处理程序使用它来发送未处理的服务器错误的回复。
 */
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 客户端的连接:
/**
 * port {Number},VSOA 服务器监听的端口号
 * host {String},VSOA 服务器监听的主机名
 * backlog {Number},TCP 连接 backlog,检查 Node.js 文档以获取更多信息
 * callback {Function},当服务器套接字正在监听时的回调函数
 */
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 为例,会发现代码实现变得比较简单和规范:
// vppjs.js
router.dgram('/name', (req, res) => {
    
    
  console.log('/user/name:',req.payload);
  // /user/name: { param: { path: '/user/ping', name: 'zhangsan' } }
  return res.datagram({
    
     param: 'welcome' });
});
vpp.use('/user', router);

// cli.js 发起请求
client.datagram('/user/name', {
    
    
  param: {
    
    
    path: '/user/name',
    name: 'zhangsan',
  }
})
  • vppjs 是基于 VSOA 的实现的一个应用框架,使用者了解 VSOA 的资源访问方式和熟悉 express 应该比较容易上手,使用 vppjs 应用框架开发 VSOA 应用,会使得开发变得更加简单和友好,对资源的访问遵守一定的原则,使得代码风格也比较规范。

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/130069978