内容简介:上两篇文章,分别对产品需求和Electron端的实现做了相关的介绍,有兴趣的朋友可以看看之前的文章。本文,将介绍服务端的实现。之前的文章也有提到,服务端的主要任务是对数据进行转发以及生成小程序二维码。对数据进行转发,主要是把用户在小程序端发送的消息,推送给Electron接收端。因此,我们需要创建一个websocket服务。在这里,我们选择使用ws模块。
上两篇文章,分别对产品需求和Electron端的实现做了相关的介绍,有兴趣的朋友可以看看之前的文章。本文,将介绍服务端的实现。
需求分析
之前的文章也有提到,服务端的主要任务是对数据进行转发以及生成小程序二维码。
对数据进行转发,主要是把用户在小程序端发送的消息,推送给Electron接收端。因此,我们需要创建一个websocket服务。在这里,我们选择使用ws模块。
生成小程序二维码,我们需要使用到微信的API。我们将使用request这个模块向微信服务器发起相关的请求。
创建websocket服务
入口文件代码如下:
const WebSocketServer = require('ws').Server; const port = require('./config').port; const log4js = require('./helpers/logger'); const logger = log4js.Logger('APP'); const wsServer = new WebSocketServer({ port }); logger.info("Server listening on port:" + port); wsServer.on('connection', function (ws) { logger.debug('a client connect'); ws.on('message', async function (message) { // 消息处理逻辑 }); ws.on('close', function () { logger.info('ws断开'); }) ws.on('error', function (error) { ws.close(); logger.error(error); }) }); 复制代码
连接上这个服务的客户端,有可能是小程序发送端,也有可能是Electron接收端,所以我们需要对收到的消息进行了简单的类型判断。
根据之前的约定,如果消息的类型type为INIT,我们就认为是接收端初始化的消息。传递的参数中,包含接收端的UID,我们将会使用这个id作为参数,生成带参数的小程序二维码。
由于我们会在公众场合使用弹幕,所以我们需要对内容进行校验,防止一些不符合社会主义核心价值观的言论出现在弹幕中。这里,我们直接使用微信的msgSecCheck接口。
ws.on('message', async function (message) { try { const data = JSON.parse(message); if (data.type === "INIT") { logger.info('获取二维码', data); // 将接收端的clientId作为连接的标识 ws.danmuId = data.clientId; // 获取微信小程序二维码 const result = await WechatService.getQrcode(data.clientId); if(result){ const respMsg = { type: 'qrcode', data: result } ws.send(JSON.stringify(respMsg)); } } else { logger.info('收到消息', ws.danmuId, message); // 对消息内容进行安全性校验 const isSecurity = await WechatService.checkContentSecurity(data.content); if(isSecurity){ // 将消息转发给对应的接收端 wsServer.clients.forEach(function (client) { if (client.danmuId === data.scene && client.readyState === 1) { client.send(message); } }); } } } catch (error) { logger.error(error); } }); 复制代码
生成带参数的小程序二维码
微信提供生成二维码的接口有三个,分别应用于不同的应用场景。具体见小程序官方文档
本项目使用getWXACodeUnlimit这个API来获取小程序码,通过该接口生成的小程序码,永久有效,数量暂无限制。
请求地址
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN 复制代码
如果调用成功,会直接返回图片***二进制内容***,如果请求失败,会返回 JSON 格式的数据。
WTF,官方文档说了,会返回二进制的内容,但是为什么我的请求返回乱码呢?
既然乱码,那应该就是编解码的问题了,看看所用的请求模块request是否有相关的参数设置,果不其然:
encoding - encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the encoding parameter to toString() (meaning this is effectively utf8 by default). (Note: if you expect binary data, you should set encoding: null.)
默认是utf8,如果我们需要二进制内容,那需要将encoding设置为null。结果输出如下:
看起来是好点了,我们通过Buffer的toString方法将其转为base64,然后传给Electron端进行展示,生成二维码的功能就完成了。
access_token获取与缓存
有微信开发经验的朋友都知道,基本上所有的微信API,请求的时候都需要带上access_token。而每天请求access_token的次数是有限制的,超出一定的限制则无法获取,只能坐等明天的到来。所以我们需要对access_token进行缓存。
由于我们的项目是单机部署,所以我们可以简单处理,将access_token存在内存中,每次先判断内存中的access_token是否过期,未过期则使用,反之则向微信服务器请求最新的,并同步更新到内存中。
如果考虑多实例部署,可以将access_token存储到 redis 中。
日志打印
鲁迅
曾经说过,没有打印日志的服务都是耍流氓。日志,是后台服务不可或缺的一部分,这里我们使用log4js进行日志的打印。
最简单的使用示例:
var log4js = require('log4js'); var logger = log4js.getLogger(); logger.level = 'debug'; logger.debug("Some debug messages"); 复制代码
详情请查看官方文档
GitHub项目地址
我们将陆续整理各端的代码放在GitHub上,有兴趣的可以查阅一下。
以上所述就是小编给大家介绍的《基于Electron + nodejs + 小程序 实现弹幕小工具(中篇)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Java 多线程中篇
- (译)2019年前端性能优化清单 — 中篇
- EOS 主网上线半年大事纪(中篇)
- 超全面 MySQL 语句加锁分析(中篇)
- Spring源码分析专题 —— IOC容器启动过程(中篇)
- B端硬件产品从0到1(中篇):研发阶段
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5经典实例
Christopher Schmitt、Kyle Simpson / 李强 / 中国电力出版社 / 2013-7 / 48.00元
《HTML5经典实例》对于从中级到高级的Web和移动Web开发者来说是绝佳之选,它帮助你选择对你有用的HTML5功能,并且帮助你体验其他的功能。个技巧的信息十分丰富,都包含了示例代码,并详细讨论了解决方案为何有效以及如何工作。一起来看看 《HTML5经典实例》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
HTML 编码/解码
HTML 编码/解码