homework-jianmu/docs/zh/14-reference/05-connector/35-node.mdx

388 lines
20 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
toc_max_heading_level: 4
sidebar_label: Node.js
title: TDengine Node.js Connector
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import RequestId from "./_request_id.mdx";
`@tdengine/websocket` 是 TDengine 的官方 Node.js 语言连接器。Node.js 开发人员可以通过它开发存取 TDengine 数据库的应用软件。
Node.js 连接器源码托管在 [GitHub](https://github.com/taosdata/taos-connector-node/tree/main)。
## 连接方式
Node.js 连接器目前仅支持 Websocket 连接器, 其通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例。
连接方式的详细介绍请参考:[连接方式](../../../develop/connect/#连接方式)
## 支持的平台
支持 Node.js 14及以上版本。
## 版本历史
| Node.js 连接器 版本 | 主要变化 | TDengine 版本 |
| :------------------: | :----------------------: | :----------------: |
| 3.1.0 | 新版本发布,支持 WebSocket 连接 | 3.2.0.0 及更高版本 |
## 处理异常
在调用连接器 api 报错后,通过 try catch 可以获取到错误的信息和错误码。
错误说明Node.js 连接器错误码在 100 到 110 之间,之外的错误为 TDengine 其他功能模块的报错。
具体的连接器错误码请参考:
| Error Code | Description | Suggested Actions |
| ---------- | -------------------------------------------------------------| ----------------------------------------------------------------------------------------- |
| 100 | invalid variables | 参数不合法,请检查相应接口规范,调整参数类型及大小。 |
| 101 | invalid url | url 错误,请检查 url 是否填写正确。 |
| 102 | received server data but did not find a callback for processing | 接收到服务端数据但没有找到上层回调 |
| 103 | invalid message type | 接收到的消息类型无法识别,请检查服务端是否正常。 |
| 104 | connection creation failed | 连接创建失败,请检查网络是否正常。 |
| 105 | websocket request timeout | 请求超时 |
| 106 | authentication fail | 认证失败,请检查用户名,密码是否正确。 |
| 107 | unknown sql type in tdengine | 请检查 TDengine 支持的 Data Type 类型。 |
| 108 | connection has been closed | 连接已经关闭,请检查 Connection 是否关闭后再次使用,或是连接是否正常。 |
| 109 | fetch block data parse fail | 获取到的查询数据,解析失败 |
| 110 | websocket connection has reached its maximum limit | Websocket 连接达到上限 |
- [TDengine Node.js Connector Error Code](https://github.com/taosdata/taos-connector-node/blob/main/nodejs/src/common/wsError.ts)
- TDengine 其他功能模块的报错,请参考 [错误码](../../../reference/error-code)
## 数据类型映射
下表为 TDengine DataType 和 Node.js DataType 之间的映射关系
| TDengine DataType | Node.js DataType|
|-------------------|-------------|
| TIMESTAMP | bigint |
| TINYINT | number |
| SMALLINT | number |
| INT | number |
| BIGINT | bigint |
| TINYINT UNSIGNED | number |
| SMALLINT UNSIGNED | number |
| INT UNSIGNED | number |
| BIGINT UNSIGNED | bigint |
| FLOAT | number |
| DOUBLE | number |
| BOOL | boolean |
| BINARY | string |
| NCHAR | string |
| JSON | string |
| VARBINARY | ArrayBuffer |
| GEOMETRY | ArrayBuffer |
**注意**JSON 类型仅在 tag 中支持。
## 更多示例程序
| 示例程序 | 示例程序描述 |
| ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------- |
| [sql_example](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/sql_example.js) | 基本的使用如如建立连接,执行 SQL 等操作。 |
| [stmt_example](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/stmt_example.js) | 绑定参数插入的示例。 | |
| [line_example](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/line_example.js) | 行协议写入示例。 |
| [tmq_example](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/tmq_example.js) | 订阅的使用示例。 |
| [all_type_query](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/all_type_query.js) | 支持全部类型示例。 |
| [all_type_stmt](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/all_type_stmt.js) | 参数绑定支持全部类型示例。 |
## 使用限制
- Node.js 连接器(`@tdengine/websocket`)支持 Node.js 14 以上版本,低于 14 的版本可能存在包兼容性的问题。
- 目前只支持 WebSocket 连接,需要提前启动 taosAdapter
- 使用连接器结束后,需要调用 taos.connectorDestroy(); 释放连接器资源。
## 常见问题
1. "Unable to establish connection" 或 "Unable to resolve FQDN"
**原因**:一般都是因为配置 FQDN 不正确。 可以参考[如何彻底搞懂 TDengine 的 FQDN](https://www.taosdata.com/blog/2021/07/29/2741.html) 。
## API 参考
Node.js 连接器(`@tdengine/websocket`, 其通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例。
### URL 规范
```text
[+<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 示例:
```js
ws://root:taosdata@localhost:6041
```
### WSConfig
除了通过指定的 URL 获取连接,还可以使用 WSConfig 指定建立连接时的参数。
```js
try {
let url = 'ws://127.0.0.1:6041'
let conf = WsSql.NewConfig(url)
conf.setUser('root')
conf.setPwd('taosdata')
conf.setDb('db')
conf.setTimeOut(500)
let wsSql = await WsSql.open(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 非必填,用于问题追踪。
- **返回值**:执行结果
```js
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 数据对象数组。
```js
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` 异常。