使用uni-app开发app时遇到mqtt.js不可用的问题

使用uni-app开发app时遇到mqtt.js不可用的问题

1 问题背景

基于 Vue3 版本创建了 uni-app 项目用于开发微信小程序,项目中用到了 mqtt.js(v4.1.0),编译为微信小程序能够正常运行,但是编译为 APP 后,控制台打印出如下错误:

TypeError: socketTask.onOpen is not a function

看到 socketTask 后立刻想到了微信小程序,个人以为是 mqtt 连接地址的问题。因为在微信小程序中使用 mqtt.js 时需要将 mqtt 连接地址写为 wx:IP地址:端口号/mqtt,所以把连接地址改为了 ws:IP地址:端口号/mqtt,重新运行后控制台打印出如下错误:

TypeError: WS is not a constructor

经过查看源码(node_modules/mqtt/dist/mqtt.js)发现相关代码如下:

// ... other code ...
var WS = require('ws')// ... other code ... if (isNative && isBrowser) {socket = new WS(target, protocols)
} else {socket = new WS(target, protocols, options)
}

添加 console.log() 语句查看 WS 变量后发现控制台打印结果为 null,即引入第三方库 ws 失败。

直接在 pages/index/index.vue 中引入 ws 库并打印变量,打印结果如下:

// pages/index/index.vue
const WS = require('ws')
console.log(WS)
# 控制台打印结果
function() {throw new Error('ws does not work in the browser. Browser clients must use the native ' + 'WebSocket object');
}

2 引发原因

经查看 ws 库的 Github 主页 发现该库仅在 Node.js 环境下运行。结合提示信息,说明 uni-app 在 APP 端的运行环境和浏览器相关。

随后查询官方文档发现:

vue页面在App端,默认是被系统的webview渲染的(不是手机自带浏览器,是rom的webview)。

也就是说 uni-app 在 APP 端的运行环境是 webview,而 ws 库仅在 Node.js 环境下运行,从而导致通过 require() 引入后为 null。

3 解决方法

既然 uni-app 在 APP 端的运行环境是 webview,而微信小程序的运行环境也是 webview,二者运行环境相似,应该可以共用一个创建 WebSocket 连接的 API。而 mqtt.js 在小程序环境中可以正常运行,所以首先将 mqtt 连接地址改回 wx:IP地址:端口号/mqtt,通过小程序 API wx.connectSocket() 创建 WebSocket 连接。

但是问题又回到了一开始,运行后控制台会打印如下错误信息:

TypeError: socketTask.onOpen is not a function

3.1 解决方法1:降低 Vue 版本【推荐⭐】

搜索了很多教程,发现其发布时间多为 2019 ~ 2021,然后想到会不会是 Vue 版本较高导致,尝试降低为 Vue2 版本后重新运行,发现运行成功。

3.2 解决方法2:修改 mqtt.js 源码【推荐⭐⭐⭐⭐⭐】

搜索教程中发现修改源码(node_modules/mqtt/dist/mqtt.js)中的 wx.connectSocket() 也可以解决,解决方法是在调用 wx.connectSocket() 时传入回调函数。

socketTask = wx.connectSocket({url: url,protocols: [websocketSubProtocol],success() {} // 增加这行代码
})

具体原理可见 uni-app 官方API uni.connectSocket():

对于 uni.connectSocket() API 而言:

如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象;

如果希望返回一个 socketTask 对象,需要至少传入 success / fail / complete 参数中的一个。

所以上面新增的回调函数也可以改为 fail() {}complete() {}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue功能】多张图片合并

多张图片合并成一张图片 步骤一,多张图片上传步骤二,循环获取所有绘制图片的总高度new FileReader()方法作用new Image()方法作用介绍 步骤三,合并多张图片canvas.toDataURL()作用-dpr作用 步骤四,下载图片 步骤一,多张…

(六)JSP与Servlet的关系

JSP与Servlet的关系 JSP(Java Server Pages)是继Servlet后Sun公司推出的新技术。JSP技术在传统的HTML文件中插入Java程序段和JSP标记,从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Window…

【006期】游戏的开始和结束界面,得分和生命值及其游戏逻辑。

核心代码 int score; int lives;boolean gameOver; void draw() {background(255);if (!gameOver) {/*游戏中的其他所有逻辑写在此处*/displayScoreAndLives(); // 显示得分和生命值} else {displayGameOverScreen(); // 显示游戏结束画面} } void displayScoreAndLives() {fil…

NASA数据集——有源空腔辐射计辐照度监测仪(ACRIM)II 本地格式的 UARS 机载太阳总辐照度(TSI)2022年1月版本

Active Cavity Radiometer Irradiance Monitor (ACRIM) II Total Solar Irradiance (TSI) aboard UARS in Native format 简介 ACRIMII_TSI_UARS_NAT 数据是上层大气研究卫星(UARS)上的有源空腔辐射计辐照度监测仪 II(ACRIM II)…

云安全防御篇:如何识别并做好服务器DDoS防护?

伴随着全球互联网业务和云计算的快速发展,作为一种破坏力巨大的攻击方式,DDoS攻击正以超出服务器承受能力的流量淹没网站,导致服务器宕机、企业营业额下跌,甚至企业品牌形象受损。越是面对复杂的攻击,就需要性能更强的…

C++:缺省函数

目录 缺省函数的概念 缺省函数的类型 全缺省 半缺省 缺省函数的声明 C语言和C中函数的区别 缺省函数的概念 缺省函数是对于有参数的函数而言的,缺省的意思就是在函数的定义的时候对函数的参数进行初始化值;在调用的时候在缺省的参数的位置上可以不进行传参; 缺省函数的…

测试大语言模型在嵌入式设备部署的可能性——模型TinyLlama-1.1B-Chat-v1.0

测试模型TinyLlama-1.1B-Chat-v1.0修改推理参数,观察参数变化与推理时间变化之间的关系。 本地环境: 处理器 Intel Core™ i5-8400 CPU 2.80GHz 2.80 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 集显 Intel UHD Graphics 630 独显 NVIDIA GeForce GTX 1050 主…

2万8金句美句格言签名句子ACCESS\EXCEL数据库

优美句子类的数据已经有《33万多优美句子经典句子ACCESS数据库》、《近2万签名的句子网络签名ACCESS数据库》、《24万QQ伤感签名微信签名ACCESS数据库》、《2万多条QQ签名论坛签名大全ACCESS数据库》,今天又遇到一个,感觉也很不错,发上来看看…

数字科技助力垃圾分类展厅,增强内容交互新体验!

如今,许多行业都开始运用数字技术,探索其在展览展示领域中的应用,其中垃圾分类展厅作为现代城市文明建设的重要一环,也通过这些技术的运用,打造出了更加生动且富有科技感的展示空间,它不仅提升公众对垃圾分…

持有消防设施设计乙级资质可承接的业务范围

持有消防设施设计乙级资质的企业,其可承接的业务范围主要包括以下方面: 中型以下工业与民用建筑消防设施设计: 民用建筑:可承担单体建筑面积在2万平方米至4万平方米之间的中型民用建筑的消防设施工程专项设计,这类建筑…

如何客观评价小米首款汽车产品SU7

作者:艾泊宇 在深入探讨小米首款汽车产品SU7的客观评价时,我们应摒弃个人情感,忽视市场营销的噪音,并过滤掉网络上的负面评价,专注于产品本身,这里我们需要用到我的产品交集模型 从用户角度看 数据是揭示用…

Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全? 信息系统(Information System) 信息系统安全三要素(CIA) 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

Java Math函数之算术运算宝典:探索数字世界的基石

1. 概述 在Java中,Math类提供了丰富的静态方法用于执行基本算术运算。这些方法使得开发者能够轻松地进行加法、减法、乘法、除法等基本的数学运算,无需自己编写复杂的算法。Math类中的算术运算方法不仅支持整数运算,还支持浮点数运算&#x…

wps/word中字体安装教程

问题:下载的字体怎么导入wps/word wps或word中没有相应字体,怎么导入。其实方法很简单。 Step 1:下载字体 首先,在网上搜索自己喜欢的字体,然后下载到本地。字体的格式通常是.ttf 下面是我网上找的字体&#xff08…

Tips:对于树模型,新增了一个feature,metric提升了不少,但是该feature的特征重要性不高,如何解释这种现象?

在树模型中,新增一个特征后,模型性能(如metric)显著提升,但该特征在特征重要性排序中并不靠前,这种现象可以从以下几个方面进行解释: 特征交互作用: 树模型能够捕捉到特征间的复杂非…

dat.GUI如何使用和常用方法

什么是dat.GUI? dat.GUI是一个轻量级的用户界面库,用于在Web应用程序中创建可交互的控件。它由Google数据艺术家工作室(Google Data Arts Team)开发,旨在简化数据可视化和实验性界面的开发过程。dat.GUI提供了一组简单…

Python编程的面向对象(二)—类的多态

Python编程的面向对象(二)—类的多态 在面向对象编程中,多态是一种重要的概念,指的是不同类的对象可以对相同的消息作出响应,表现出不同的行为。多态允许使用基类的引用来调用派生类的方法,实现了接口的统一。 多态的特点&#…

CAPL学习之路-TLS函数

The Transport Layer Security (TLS) Protocol,传输层安全协议。通常是基于TCP传输协议基础上的安全认证协议,不用在UDP上。 为什么TLS不用在UDP协议上? UDP本身就不是一个可靠的协议,你在一个不可靠的协议上进行安全认证,就像是没打地基就想确保房子坚固,这可能吗? 常…

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ①

在android系统中fence用于不同模块需要访问同一块buffer的同步,例如camera和graphic。对于preview buffer, camera是生产者graphic是消费者。 camera需要生产图像数据到preview buffer时需要等待preview buffer的 fence可用。 camera sync是高通camx框架里面用于各个…

C/C++常用开源库总结

文章目录 库名主要功能和组件语言miniftpd研究简单的ftp服务器Cmuduo的研究目录记录学习muduo库的一些笔记Cyaziyazi封装的json解析库、ini解析库、xml解析库、简单的基于TCP的多线程服务器–ZeroMQ––Abseil字符串操作: Abseil 提供了一套强大而灵活的字符串处理工具&#xf…