TDengine 语言连接器(Node.js)

news2025/4/16 17:22:46

简介

@tdengine/websocket 是 TDengine 的官方 Node.js 语言连接器。Node.js 开发人员可以通过它开发存取 TDengine 数据库的应用软件。
Node.js 连接器源码托管在 GitHub。

Node.js 版本兼容性

支持 Node.js 14 及以上版本。

支持的平台

支持所有能运行 Node.js 的平台。

版本历史

Node.js 连接器 版本主要变化TDengine 版本
3.1.5密码支持特殊字符-
3.1.4修改 readme-
3.1.3升级了 es5-ext 版本,解决低版本的漏洞-
3.1.2对数据协议和解析进行了优化,性能得到大幅提升-
3.1.1优化了数据传输性能3.3.2.0 及更高版本
3.1.0新版本发布,支持 WebSocket 连接3.2.0.0 及更高版本

处理异常

在调用连接器 api 报错后,通过 try catch 可以获取到错误的信息和错误码。

错误说明:Node.js 连接器错误码在 100 到 110 之间,之外的错误为 TDengine 其他功能模块的报错。

具体的连接器错误码请参考:

Error CodeDescriptionSuggested Actions
100invalid variables参数不合法,请检查相应接口规范,调整参数类型及大小。
101invalid urlurl 错误,请检查 url 是否填写正确。
102received server data but did not find a callback for processing接收到服务端数据但没有找到上层回调
103invalid message type接收到的消息类型无法识别,请检查服务端是否正常。
104connection creation failed连接创建失败,请检查网络是否正常。
105websocket request timeout请求超时
106authentication fail认证失败,请检查用户名,密码是否正确。
107unknown sql type in tdengine请检查 TDengine 支持的 Data Type 类型。
108connection has been closed连接已经关闭,请检查 Connection 是否关闭后再次使用,或是连接是否正常。
109fetch block data parse fail获取到的查询数据,解析失败
110websocket connection has reached its maximum limitWebSocket 连接达到上限
  • TDengine Node.js Connector Error Code
  • TDengine 其他功能模块的报错,请参考 错误码

数据类型映射

下表为 TDengine DataType 和 Node.js DataType 之间的映射关系

TDengine DataTypeNode.js DataType
TIMESTAMPbigint
TINYINTnumber
SMALLINTnumber
INTnumber
BIGINTbigint
TINYINT UNSIGNEDnumber
SMALLINT UNSIGNEDnumber
INT UNSIGNEDnumber
BIGINT UNSIGNEDbigint
FLOATnumber
DOUBLEnumber
BOOLboolean
BINARYstring
NCHARstring
JSONstring
VARBINARYArrayBuffer
GEOMETRYArrayBuffer

注意:JSON 类型仅在 tag 中支持。

更多示例程序

示例程序示例程序描述
sql_example基本的使用如如建立连接,执行 SQL 等操作。
stmt_example绑定参数插入的示例。
line_example行协议写入示例。
tmq_example订阅的使用示例。
all_type_query支持全部类型示例。
all_type_stmt参数绑定支持全部类型示例。

使用限制

  • Node.js 连接器(@tdengine/websocket)支持 Node.js 14 以上版本,低于 14 的版本可能存在包兼容性的问题。
  • 目前只支持 WebSocket 连接,需要提前启动 taosAdapter
  • 使用连接器结束后,需要调用 taos.connectorDestroy(); 释放连接器资源。

常见问题

  1. “Unable to establish connection” 或 “Unable to resolve FQDN”

    原因:一般都是因为配置 FQDN 不正确。可以参考 如何彻底搞懂 TDengine 的 FQDN 。

API 参考

Node.js 连接器(@tdengine/websocket), 其通过 taosAdapter 提供的 WebSocket 接口连接 TDengine 实例。

URL 规范

[+<protocol>]://[[<username>:<password>@]<host>:<port>][/<database>][?<p1>=<v1>[&<p2>=<v2>]]
|------------|---|-----------|-----------|------|------|------------|-----------------------|
|   protocol |   | username  | password  | host | port |  database  |  params               |
  • protocol:使用 websocket 协议建立连接。例如ws://localhost:6041

  • username/password:数据库的用户名和密码。

  • host/port:主机地址和端口号。例如localhost:6041

  • database:数据库名称。

  • params:其他参数。例如 token。

  • 完整 URL 示例:

    ws://root:taosdata@localhost:6041

WSConfig

除了通过指定的 URL 获取连接,还可以使用 WSConfig 指定建立连接时的参数。

const taos = require("@tdengine/websocket");

async function createConnect() {
    try {
        let url = 'ws://127.0.0.1:6041'
        let conf = new taos.WSConfig(url)
        conf.setUser('root')
        conf.setPwd('taosdata')
        conf.setDb('db')
        conf.setTimeOut(500)
        let wsSql = await taos.sqlConnect(conf)
    } catch (e) {
        console.error(e);
    }
}

WSConfig 中的配置如下:

  • setUrl(url string) 设置 taosAdapter 连接地址 url,详见上文 URL 规范。
  • setUser(user: string) 设置数据库用户名。
  • setPwd(pws:string) 设置数据库密码。
  • setDb(db: string) 设置数据库名称。
  • setTimeOut(ms : number) 设置连接超时,单位毫秒。
  • setToken(token: string) 设置 taosAdapter 认证 token。

连接功能

  • static async open(wsConfig:WSConfig):Promise<WsSql>
    • 接口说明:建立 taosAdapter 连接。
    • 参数说明
      • wsConfig:连接配置,详见上文 WSConfig 章节。
    • 返回值:连接对象。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • destroyed()
    • 接口说明:释放销毁资源。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。

获取 taosc 版本号

  • async version(): Promise<string>
    • 接口说明:获取 taosc 客户端版本。
    • 返回值:taosc 客户端版本号。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。

执行 SQL

  • async exec(sql: string, reqId?: number): Promise<TaosResult>
    • 接口说明:执行 sql 语句。
    • 参数说明
      • sql:待执行的 sql 语句。
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值:执行结果
      TaosResult {
          affectRows: number,   影响的条数
          timing: number,       执行时长
          totalTime: number,    响应总时长
      }    
      
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async query(sql: string, reqId?:number): Promise<WSRows>
    • 接口说明:查询数据。
    • 参数说明
      • sql:待执行的查询 sql 语句。
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值:WSRows 数据集对象。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。

数据集

  • getMeta():Array<TDengineMeta> | null
    • 接口说明:获取查询结果的列的数量、类型和长度。
    • 返回值:TDengineMeta 数据对象数组。
    export interface TDengineMeta {
        name: string,
        type: string,
        length: number,
    }
    
  • async next(): Promise<boolean>
    • 接口说明:将游标从当前位置向后移动一行。用于遍历查询结果集。
    • 返回值:如果新的当前行有效,则返回 true;如果结果集中没有更多行,则返回 false。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • getData(): Array<any>
    • 接口说明:返回查询的一行数据。
    • 返回值:返回查询的一行数据,此接口需要搭配 next 接口一起使用。
  • async close():Promise<void>
    • 接口说明:数据读取完成后,释放结果集。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。

无模式写入

  • async schemalessInsert(lines: Array<string>, protocol: SchemalessProto, precision: Precision, ttl: number, reqId?: number): Promise<void>
    • 接口说明:无模式写入。
    • 参数说明
      • lines:待写入的数据数组,无模式具体的数据格式可参考 Schemaless 写入
      • protocol:协议类型
        • SchemalessProto.InfluxDBLineProtocol:InfluxDB 行协议(Line Protocol)。
        • SchemalessProto.OpenTSDBTelnetLineProtocol:OpenTSDB 文本行协议。
        • SchemalessProto.OpenTSDBJsonFormatProtocol:JSON 协议格式。
      • precision:时间精度
        • Precision.HOURS:小时
        • Precision.MINUTES:分钟
        • Precision.SECONDS:秒
        • Precision.MILLI_SECONDS:毫秒
        • Precision.MICRO_SECONDS:微秒
        • Precision.NANO_SECONDS:纳秒
      • ttl:表过期时间,单位天。
      • reqId:用于问题追踪,可选。
    • 异常:连接失败抛出 TaosResultError 异常。

参数绑定

  • async stmtInit(reqId?:number): Promise<WsStmt>
    • 接口说明 使用 WsSql 对象创建 stmt 对象。
    • 参数说明
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值:stmt 对象。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async prepare(sql: string): Promise<void>
    • 接口说明 绑定预编译 sql 语句。
    • 参数说明
      • sql:预编译的 SQL 语句。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async setTableName(tableName: string): Promise<void>
    • 接口说明 设置将要写入数据的表名。
    • 参数说明
      • tableName:表名,如果需要指定数据库,例如:db_name.table_name 即可。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
      通过 StmtBindParams 对象设置绑定数据。
  • setBoolean(params :any[])
    • 接口说明 设置布尔值。
    • 参数说明
      • params:布尔类型列表。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • 下面接口除了要设置的值类型不同外,其余同 setBoolean:
    • setTinyInt(params :any[])
    • setUTinyInt(params :any[])
    • setSmallInt(params :any[])
    • setUSmallInt(params :any[])
    • setInt(params :any[])
    • setUInt(params :any[])
    • setBigint(params :any[])
    • setUBigint(params :any[])
    • setFloat(params :any[])
    • setDouble(params :any[])
    • setVarchar(params :any[])
    • setBinary(params :any[])
    • setNchar(params :any[])
    • setJson(params :any[])
    • setVarBinary(params :any[])
    • setGeometry(params :any[])
    • setTimestamp(params :any[])
  • async setTags(paramsArray:StmtBindParams): Promise<void>
    • 接口说明 设置表 Tags 数据,用于自动建表。
    • 参数说明
      • paramsArray:Tags 数据。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async bind(paramsArray:StmtBindParams): Promise<void>
    • 接口说明 绑定数据。
    • 参数说明
      • paramsArray:绑定数据。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async batch(): Promise<void>
    • 接口说明 提交绑定数据。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • async exec(): Promise<void>
    • 接口说明 执行将绑定的数据全部写入。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。
  • getLastAffected()
    • 接口说明 获取写入条数。
    • 返回值:写入条数。
  • async close(): Promise<void>
    • 接口说明 关闭 stmt 对象。
    • 异常:连接失败抛出 TDWebSocketClientError 异常。

数据订阅

  • 创建消费者支持属性列表
    • taos.TMQConstants.CONNECT_USER:用户名。
    • taos.TMQConstants.CONNECT_PASS:密码。
    • taos.TMQConstants.GROUP_ID:所在的 group。
    • taos.TMQConstants.CLIENT_ID:客户端 id。
    • taos.TMQConstants.WS_URL:taosAdapter 的 url 地址。
    • taos.TMQConstants.AUTO_OFFSET_RESET:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
    • taos.TMQConstants.ENABLE_AUTO_COMMIT:是否允许自动提交。
    • taos.TMQConstants.AUTO_COMMIT_INTERVAL_MS:自动提交间隔。
    • taos.TMQConstants.CONNECT_MESSAGE_TIMEOUT:数据传输超时参数,单位 ms,默认为 10000 ms。
  • static async newConsumer(wsConfig:Map<string, any>):Promise<WsConsumer>
    • 接口说明 消费者构造函数。
    • 参数说明
      • wsConfig:创建消费者属性配置。
    • 返回值:WsConsumer 消费者对象。
    • 异常:如果在执行过程中出现异常,抛出 TDWebSocketClientError 错误。
  • async subscribe(topics: Array<string>, reqId?:number): Promise<void>
    • 接口说明 订阅一组主题。
    • 参数说明
      • topics:订阅的主题列表。
      • reqId:请求 id 非必填,用于问题追踪。
    • 异常:失败抛出 TDWebSocketClientError 异常。
  • async unsubscribe(reqId?:number): Promise<void>
    • 接口说明 取消订阅。
    • 参数说明
      • reqId:请求 id 非必填,用于问题追踪。
    • 异常:失败抛出 TDWebSocketClientError 异常。
  • async poll(timeoutMs: number, reqId?:number):Promise<Map<string, TaosResult>>
    • 接口说明 轮询消息。
    • 参数说明
      • timeoutMs:表示轮询的超时时间,单位毫秒。
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值Map<string, TaosResult> 每个主题对应的数据。
    • 异常:失败抛出 TDWebSocketClientError 异常。
  • async subscription(reqId?:number):Promise<Array<string>>
    • 接口说明 获取当前订阅的所有主题。
    • 参数说明
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值Array<string> 主题列表。
    • 异常:失败抛出 TDWebSocketClientError 异常。
  • async commit(reqId?:number):Promise<Array<TopicPartition>>
    • 接口说明 提交当前处理的消息的偏移量。
    • 参数说明
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值Array<TopicPartition> 每个主题的消费进度。
    • 异常:失败抛出 TDWebSocketClientError 异常。
  • async committed(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>
    • 接口说明:获取一组分区最后提交的偏移量。
    • 参数说明
      • partitions:一个 Array<TopicPartition> 类型的参数,表示要查询的分区集合。
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值Array<TopicPartition>,即一组分区最后提交的偏移量。
    • 异常:如果在获取提交的偏移量过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async seek(partition:TopicPartition, reqId?:number):Promise<void>
    • 接口说明:将给定分区的偏移量设置到指定的位置。
    • 参数说明
      • partition:一个 TopicPartition 类型的参数,表示要操作的分区和要设置的偏移量。
      • reqId:请求 id 非必填,用于问题追踪。
    • 异常:如果在设置偏移量过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async positions(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>
    • 接口说明:获取给定分区当前的偏移量。
    • 参数说明
      • partitions:一个 TopicPartition 类型的参数,表示要查询的分区。
      • reqId:请求 id 非必填,用于问题追踪。
    • 返回值Array<TopicPartition>,即一组分区最后提交的偏移量。
    • 异常:如果在获取偏移量过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async seekToBeginning(partitions:Array<TopicPartition>):Promise<void>
    • 接口说明:将一组分区的偏移量设置到最早的偏移量。
    • 参数说明
      • partitions:一个 Array<TopicPartition> 类型的参数,表示要操作的分区集合。
    • 异常:如果在设置偏移量过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async seekToEnd(partitions:Array<TopicPartition>):Promise<void>
    • 接口说明:将一组分区的偏移量设置到最新的偏移量。
    • 参数说明
      • partitions:一个 Array<TopicPartition> 类型的参数,表示要操作的分区集合。
    • 异常:如果在设置偏移量过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async assignment(topics?:string[]):Promise<Array<TopicPartition>>
    • 接口说明:获取消费者当前分配的指定的分区或所有分区。
    • 参数说明
      • topics:需要获取的分区(非必填),不填表示获取全部的分区
    • 返回值:返回值类型为 Array<TopicPartition>,即消费者当前分配的所有分区。
    • 异常:如果在获取分配的分区过程中发生错误,将抛出 TDWebSocketClientError 异常。
  • async close():Promise<void>
    • 接口说明:关闭 tmq 连接。
    • 异常:操作失败抛出 TDWebSocketClientError 异常。

访问官网

更多内容欢迎访问 TDengine 官网

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

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

相关文章

活动图与流程图的区别与联系:深入理解两种建模工具

目录 前言1. 活动图概述1.1 活动图的定义1.2 活动图的基本构成要素1.3 活动图的应用场景 2. 流程图概述2.1 流程图的定义2.2 流程图的基本构成要素2.3 流程图的应用场景 3. 活动图与流程图的联系4. 活动图与流程图的区别4.1 所属体系不同4.2 表达能力差异4.3 使用目的与语境4.4…

图片文本识别OCR+DeepSeekapi实现提取图片关键信息

用到的技术&#xff1a; 通过腾讯OCR文字识别&#xff0c;deepseek的api实现 目录 需求分析&#xff1a; 文字识别&#xff08;OCR&#xff09;具体实现步骤 起步工作 代码编写 deepseek整合消息&#xff0c;返回文本关键信息 起步工作 编写工具类 具体调用实现 具体…

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我们研究了go函数调用时的栈布…

解决Ubuntu Desktop 24.04 VMware中安装后不能全屏显示,只能居中的问题

Ubuntu Desktop 24.04 VMware中安装后不能全屏显示&#xff0c;只能居中。 sudo apt-get install open-vm-tools sudo apt-get install open-vm*

【笔记ing】AI大模型-04逻辑回归模型

一个神经网络结构&#xff0c;其中的一个神经网络层&#xff0c;本质就是一个逻辑回归模型 深度神经网络的本质就是多层逻辑回归模型互相连接或采用一定的特殊连接的方式连接在一起构成的。其中每一个层本质就是一个逻辑回归模型。 逻辑回归模型基本原理 逻辑回归&#xff0…

记录学习的第二十五天

今天终于又开始更新了。实在是星期六的蓝桥杯给了我一个大大的打击&#xff0c;今天终于好不容易缓过来了&#xff0c;可以好好学算法了。 还是老规划&#xff0c;力扣的每日一题。不过今天的每日一题我之前做过了&#xff0c;就又提交了一次来签到。 之后三道哈希表题目。 我一…

linux电源管理(二),内核的CPUFreq(DVFS)和ARM的SCPI

更多linux系统电源管理相关的内容请看&#xff1a;https://blog.csdn.net/u010936265/article/details/146436725?spm1011.2415.3001.5331 1 简介 CPUFreq子系统位于drivers/cpufreq目录下&#xff0c;负责进行运行过程中CPU频率和电压的动态调整&#xff0c;即DVFS (Dynami…

ES6学习04-数组扩展:扩展运算符、新增方法

一、扩展运算符 1. 2. eg: 3. 二、新增方法 1. arguments 元素组合 类似数组对象 2.

滚轮控制目标臂长度调整相机距离

通过鼠标滚轮来控制摄像机目标臂长度 , 调整相机距离 看图就行,不多说,照着连就完事了

​‌FireCrawl‌爬虫工具​, Craw4ai

‌FireCrawl‌是一款开源的AI爬虫工具&#xff0c;专门用于Web数据提取&#xff0c;并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站&#xff0c;能够自动抓取网站及其所有可访问的子页面内容&#xff0c;并将其转换为适合大语言…

pyenv库应用入门与Ubuntu端安装实践

pyenv库应用入门与Ubuntu端安装实践 pyenv概述virtualenv、pyvenv、pyenvvirtualenvpyvenvpyenv Ubuntu端安装pyenv实践安装依赖报错解决安装pyenv配置环境变量更换pyenv源地址 pyenv基本用法安装成功服务器部署scrapyd pyenv概述 pyenv 是一个用于管理多个 Python 版本的工具…

CS5346 - Annotation in Visualization (可视化中的注释)

文章目录 Annotation 的重要性Levels of Annotation &#xff08;注释的层级&#xff09;Headings and IntroductionHeadings&#xff08;标题&#xff09;陈述型&#xff08;Statement&#xff09;&#xff1a;突出结论或有趣发现疑问型&#xff08;Question&#xff09;&…

如何开发一套场外个股期权交易系统?个股期权交易软件包含:询价,报价,交易,持仓,行权,账户盈亏统计等

一、场外个股期权的定义与特点 场外个股期权&#xff08;Over-the-Counter Equity Option&#xff09;是一种由交易双方私下协商的非标准化金融衍生品合约&#xff0c;以特定个股为标的资产。与交易所上市的标准化期权不同&#xff0c;其合约条款&#xff08;如行权价、到期日…

高速电路中的电阻、电容的选型及应用

2.1 电阻的应用 2.1.1 与电阻相关的经典案例 如果说芯片是电路的骨架&#xff0c;那么电阻就是在芯片之间起连接作用的关节。电阻的阻值、布放位置等&#xff0c;对设计的成功起着至关重要的作用。 【案例2.1】串联电阻过大&#xff0c;导致板间告警失败 某产品由业务板和主…

六、adb通过Wifi连接

背景 收集是荣耀X40,数据线原装全新的&#xff0c;USB连上之后&#xff0c;老是断&#xff0c;电脑一直叮咚叮咚的响个不停&#xff0c;试试WIFI 连接是否稳定&#xff0c;需要手机和电脑用相同的WIFI. 连接 1.通过 USB 连接手机和电脑(打开USB调试等这些都略过) adb device…

‌DeepSeek模型在非图形智能体的应用中是否需要GPU

答&#xff1a;不一定 概念 1、是否需要GPU与应用是否图形处理应用无关 2、文本内容智能体大多也需要GPU来提供更好的性能 3、‌DeepSeek模型在非图形智能体的应用中是否需要GPU取决于具体的模型版本和部署环境 不需要GPU的模型版本 ‌DeepSeek-R1-1.5B‌&#xff1a; 这…

4.14代码随想录第四十三天打卡

图论理论基础 https://www.programmercarl.com/kamacoder/%E5%9B%BE%E8%AE%BA%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 98. 所有可达路径 (1)题目描述: (2)解题思路: #include <iostream> #include <vector> #include <list> using namespace std;vec…

【视频目标分割论文集】Efficient Track Anything0000

github 摘要 视频对象分割和追踪任意目标领域出现了强大的工具——分割任意模型 2&#xff08;SAM 2&#xff09;。SAM 2 实现令人印象深刻的视频对象分割性能的关键组成部分包括用于帧特征提取的大型多阶段图像编码器&#xff0c;以及存储过去帧记忆上下文以辅助当前帧分割的…

码率自适应(ABR)决策的直播场景

直播场景 1. 直播场景的普遍框架与工作原理 主播端&#xff1a;即各类主播&#xff08;游戏、网红歌手、户外达人等&#xff09;&#xff0c;通过手机端或者个人电脑在线直播录制个人活动。 编码服务器&#xff1a;主播端上传视频流以后&#xff0c;编码服务器根据相应的编码转…

SCP-Firmware安全通告:CVE-2024-11863和CVE-2024-11864

安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、修复建议 五、致谢 六、版本历史 一、概述 在SCP固件(SCP-Firmware)中发现两处安全漏洞&#xff0c;可能允许普通世界特权软件&#xff08;normal world privileged software&#xff…