TDengine Node.js Connector

@tdengine/client@tdengine/rest 是 TDengine 的官方 Node.js 语言连接器。 Node.js 开发人员可以通过它开发可以存取 TDengine 集群数据的应用软件。注意:从 TDengine 3.0 开始 Node.js 原生连接器的包名由 td2.0-connector 改名为 @tdengine/client 而 rest 连接器的包名由 td2.0-rest-connector 改为 @tdengine/rest。并且不与 TDengine 2.x 兼容。

@tdengine/client原生连接器,它通过 TDengine 客户端驱动程序(taosc)连接 TDengine 运行实例,支持数据写入、查询、订阅、schemaless 接口和参数绑定接口等功能。@tdengine/restREST 连接器,它通过 taosAdapter 提供的 REST 接口连接 TDengine 的运行实例。REST 连接器可以在任何平台运行,但性能略为下降,接口实现的功能特性集合和原生接口有少量不同。

Node.js 连接器源码托管在 GitHub

支持的平台

原生连接器支持的平台和 TDengine 客户端驱动支持的平台一致。 REST 连接器支持所有能运行 Node.js 的平台。

版本支持

请参考版本支持列表

支持的功能特性

  • 原生连接器
  • REST 连接器
  1. 连接管理
  2. 普通查询
  3. 连续查询
  4. 参数绑定
  5. 订阅功能
  6. Schemaless

  7. 连接管理

  8. 普通查询
  9. 连续查询

安装步骤

安装前准备

  • 安装 Node.js 开发环境
  • 如果使用 REST 连接器,跳过此步。但如果使用原生连接器,请安装 TDengine 客户端驱动,具体步骤请参考安装客户端驱动。我们使用 node-gyp 和 TDengine 实例进行交互,还需要根据具体操作系统来安装下文提到的一些依赖工具。

  • Linux 系统安装依赖工具

  • macOS 系统安装依赖工具
  • Windows 系统安装依赖工具

  • python (建议v2.7 , v3.x.x 目前还不支持)

  • @tdengine/client 3.0.0 支持 Node.js LTS v10.9.0 或更高版本, Node.js LTS v12.8.0 或更高版本;其他版本可能存在包兼容性的问题
  • make
  • C 语言编译器,GCC v4.8.5 或更高版本

  • python (建议v2.7 , v3.x.x 目前还不支持)

  • @tdengine/client 3.0.0 目前是只支持 Node.js v12.22.12 或 v12 的更高版本;其他版本可能存在包兼容性的问题
  • make
  • C 语言编译器,GCC v4.8.5 或更高版本

  • 安装方法 1

使用微软的windows-build-toolscmd 命令行界面执行npm install --global --production windows-build-tools 即可安装所有的必备工具。

  • 安装方法 2

手动安装以下工具:

参考微软的 Node.js 用户手册Microsoft’s Node.js Guidelines for Windows

如果在 Windows 10 ARM 上使用 ARM64 Node.js,还需添加 “Visual C++ compilers and libraries for ARM64” 和 “Visual C++ ATL for ARM64”。

使用 npm 安装

  • 安装原生连接器
  • 安装 REST 连接器
  1. npm install @tdengine/client
  1. npm install @tdengine/rest

安装验证

  • 原生连接器
  • REST 连接器

在安装好 TDengine 客户端后,使用 nodejsChecker.js 程序能够验证当前环境是否支持 Node.js 方式访问 TDengine。

验证方法:

  • 新建安装验证目录,例如:~/tdengine-test,下载 GitHub 上 nodejsChecker.js 源代码到本地。

  • 在命令行中执行以下命令。

  1. npm init -y
  2. npm install @tdengine/client
  3. node nodejsChecker.js host=localhost
  • 执行以上步骤后,在命令行会输出 nodejsChecker.js 连接 TDengine 实例,并执行简单插入和查询的结果。

在安装好 TDengine 客户端后,使用 nodejsChecker.js 程序能够验证当前环境是否支持 Node.js 方式访问 TDengine。

验证方法:

  • 新建安装验证目录,例如:~/tdengine-test,下载 GitHub 上 restChecker.js 源代码到本地。

  • 在命令行中执行以下命令。

  1. npm init -y
  2. npm install @tdengine/rest
  3. node restChecker.js
  • 执行以上步骤后,在命令行会输出 restChecker.js 连接 TDengine 实例,并执行简单插入和查询的结果。

建立连接

请选择使用一种连接器。

  • 原生连接
  • REST 连接

安装并引用 @tdengine/client 包。

  1. //A cursor also needs to be initialized in order to interact with TDengine from Node.js.
  2. const taos = require("@tdengine/client");
  3. var conn = taos.connect({
  4. host: "127.0.0.1",
  5. user: "root",
  6. password: "taosdata",
  7. config: "/etc/taos",
  8. port: 0,
  9. });
  10. var cursor = conn.cursor(); // Initializing a new cursor
  11. //Close a connection
  12. conn.close();

安装并引用 @tdengine/rest 包。

  1. //A cursor also needs to be initialized in order to interact with TDengine from Node.js.
  2. import { options, connect } from "@tdengine/rest";
  3. options.path = "/rest/sql";
  4. // set host
  5. options.host = "localhost";
  6. // set other options like user/passwd
  7. let conn = connect(options);
  8. let cursor = conn.cursor();

使用示例

写入数据

SQL 写入

  • 原生连接
  • REST 连接
  1. const taos = require("@tdengine/client");
  2. const conn = taos.connect({
  3. host: "localhost",
  4. });
  5. const cursor = conn.cursor();
  6. try {
  7. cursor.execute("CREATE DATABASE power");
  8. cursor.execute("USE power");
  9. cursor.execute(
  10. "CREATE STABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT)"
  11. );
  12. var sql = `INSERT INTO power.d1001 USING power.meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000)
  13. power.d1002 USING power.meters TAGS('California.SanFrancisco', 3) VALUES ('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000)
  14. power.d1003 USING power.meters TAGS('California.LosAngeles', 2) VALUES ('2018-10-03 14:38:05.500', 11.80000, 221, 0.28000) ('2018-10-03 14:38:16.600', 13.40000, 223, 0.29000)
  15. power.d1004 USING power.meters TAGS('California.LosAngeles', 3) VALUES ('2018-10-03 14:38:05.000', 10.80000, 223, 0.29000) ('2018-10-03 14:38:06.500', 11.50000, 221, 0.35000)`;
  16. cursor.execute(sql,{'quiet':false});
  17. } finally {
  18. cursor.close();
  19. conn.close();
  20. }
  21. // run with: node insert_example.js
  22. // output:
  23. // Successfully connected to TDengine
  24. // Query OK, 0 row(s) affected (0.00509570s)
  25. // Query OK, 0 row(s) affected (0.00130880s)
  26. // Query OK, 0 row(s) affected (0.00467900s)
  27. // Query OK, 8 row(s) affected (0.04043550s)
  28. // Connection is closed

查看源码

  1. const { options, connect } = require("@tdengine/rest");
  2. async function sqlInsert() {
  3. options.path = "/rest/sql";
  4. options.host = "localhost";
  5. options.port = 6041;
  6. let conn = connect(options);
  7. let cursor = conn.cursor();
  8. try {
  9. let res = await cursor.query('CREATE DATABASE power');
  10. res = await cursor.query('CREATE STABLE power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int)');
  11. res = await cursor.query('INSERT INTO power.d1001 USING power.meters TAGS ("California.SanFrancisco", 2) VALUES (NOW, 10.2, 219, 0.32)');
  12. console.log("res.getResult()", res.getResult());
  13. } catch (err) {
  14. console.log(err);
  15. }
  16. }
  17. sqlInsert();

查看源码

InfluxDB 行协议写入

  • 原生连接
  1. const taos = require("@tdengine/client");
  2. const conn = taos.connect({
  3. host: "localhost",
  4. });
  5. const cursor = conn.cursor();
  6. function createDatabase() {
  7. cursor.execute("CREATE DATABASE test");
  8. cursor.execute("USE test");
  9. }
  10. function insertData() {
  11. const lines = [
  12. "meters,location=California.LosAngeles,groupid=2 current=11.8,voltage=221,phase=0.28 1648432611249",
  13. "meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0.29 1648432611250",
  14. "meters,location=California.LosAngeles,groupid=3 current=10.8,voltage=223,phase=0.29 1648432611249",
  15. "meters,location=California.LosAngeles,groupid=3 current=11.3,voltage=221,phase=0.35 1648432611250",
  16. ];
  17. cursor.schemalessInsert(
  18. lines,
  19. taos.SCHEMALESS_PROTOCOL.TSDB_SML_LINE_PROTOCOL,
  20. taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_MILLI_SECONDS
  21. );
  22. }
  23. try {
  24. createDatabase();
  25. insertData();
  26. } finally {
  27. cursor.close();
  28. conn.close();
  29. }

查看源码

OpenTSDB Telnet 行协议写入

  • 原生连接
  1. const taos = require("@tdengine/client");
  2. const conn = taos.connect({
  3. host: "localhost",
  4. });
  5. const cursor = conn.cursor();
  6. function createDatabase() {
  7. cursor.execute("CREATE DATABASE test");
  8. cursor.execute("USE test");
  9. }
  10. function insertData() {
  11. const lines = [
  12. "meters.current 1648432611249 10.3 location=California.SanFrancisco groupid=2",
  13. "meters.current 1648432611250 12.6 location=California.SanFrancisco groupid=2",
  14. "meters.current 1648432611249 10.8 location=California.LosAngeles groupid=3",
  15. "meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3",
  16. "meters.voltage 1648432611249 219 location=California.SanFrancisco groupid=2",
  17. "meters.voltage 1648432611250 218 location=California.SanFrancisco groupid=2",
  18. "meters.voltage 1648432611249 221 location=California.LosAngeles groupid=3",
  19. "meters.voltage 1648432611250 217 location=California.LosAngeles groupid=3",
  20. ];
  21. cursor.schemalessInsert(
  22. lines,
  23. taos.SCHEMALESS_PROTOCOL.TSDB_SML_TELNET_PROTOCOL,
  24. taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_NOT_CONFIGURED
  25. );
  26. }
  27. try {
  28. createDatabase();
  29. insertData();
  30. } finally {
  31. cursor.close();
  32. conn.close();
  33. }

查看源码

OpenTSDB JSON 行协议写入

  • 原生连接
  1. const taos = require("@tdengine/client");
  2. const conn = taos.connect({
  3. host: "localhost",
  4. });
  5. const cursor = conn.cursor();
  6. function createDatabase() {
  7. cursor.execute("CREATE DATABASE test");
  8. cursor.execute("USE test");
  9. }
  10. function insertData() {
  11. const lines = [
  12. {
  13. metric: "meters.current",
  14. timestamp: 1648432611249,
  15. value: 10.3,
  16. tags: { location: "California.SanFrancisco", groupid: 2 },
  17. },
  18. {
  19. metric: "meters.voltage",
  20. timestamp: 1648432611249,
  21. value: 219,
  22. tags: { location: "California.LosAngeles", groupid: 1 },
  23. },
  24. {
  25. metric: "meters.current",
  26. timestamp: 1648432611250,
  27. value: 12.6,
  28. tags: { location: "California.SanFrancisco", groupid: 2 },
  29. },
  30. {
  31. metric: "meters.voltage",
  32. timestamp: 1648432611250,
  33. value: 221,
  34. tags: { location: "California.LosAngeles", groupid: 1 },
  35. },
  36. ];
  37. cursor.schemalessInsert(
  38. [JSON.stringify(lines)],
  39. taos.SCHEMALESS_PROTOCOL.TSDB_SML_JSON_PROTOCOL,
  40. taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_NOT_CONFIGURED
  41. );
  42. }
  43. try {
  44. createDatabase();
  45. insertData();
  46. } finally {
  47. cursor.close();
  48. conn.close();
  49. }

查看源码

查询数据

  • 原生连接
  • REST 连接
  1. const taos = require("@tdengine/client");
  2. const conn = taos.connect({ host: "localhost", database: "power" });
  3. const cursor = conn.cursor();
  4. const query = cursor.query("SELECT ts, current FROM meters LIMIT 2");
  5. query.execute().then(function (result) {
  6. result.pretty();
  7. });
  8. // output:
  9. // Successfully connected to TDengine
  10. // ts | current |
  11. // =======================================================
  12. // 2018-10-03 14:38:05.000 | 10.3 |
  13. // 2018-10-03 14:38:15.000 | 12.6 |

查看源码

  1. const { options, connect } = require("@tdengine/rest");
  2. async function query() {
  3. options.path = "/rest/sql";
  4. options.host = "localhost";
  5. options.port = 6041;
  6. let conn = connect(options);
  7. let cursor = conn.cursor();
  8. try {
  9. let res = await cursor.query('select * from power.meters');
  10. console.log("res.getResult()", res.getResult());
  11. } catch (err) {
  12. console.log(err);
  13. }
  14. }
  15. query();

查看源码

更多示例程序

示例程序示例程序描述
basicUse基本的使用如如建立连接,执行 SQL 等操作。
stmtBindBatch绑定多行参数插入的示例。
stmtBindSingleParamBatch按列绑定参数插入的示例。
stmtQuery绑定参数查询的示例。
schemless insertschemless 插入的示例。
TMQ订阅的使用示例。
asyncQuery异步查询的使用示例。
REST使用 REST 连接的 TypeScript 使用示例。

使用限制

native 连接器(@tdengine/client) >= v3.0.0 目前支持 node 的版本为:支持 >=v12.8.0 <= v12.9.1 || >=v10.20.0 <= v10.9.0 ;2.0.5 及更早版本支持 v10.x 版本,其他版本可能存在包兼容性的问题。

其他说明

Node.js 连接器的使用参见视频教程

常见问题

  1. 使用 REST 连接需要启动 taosadapter。

    1. sudo systemctl start taosadapter
  2. Node.js 版本

    原生连接器 @tdengine/client 目前兼容的 Node.js 版本为:>=v10.20.0 <= v10.9.0 || >=v12.8.0 <= v12.9.1

  3. “Unable to establish connection”,”Unable to resolve FQDN”

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

重要更新记录

原生连接器

package nameversionTDengine version说明
@tdengine/client3.0.03.0.0支持TDengine 3.0 且不与2.x 兼容。
td2.0-connector2.0.122.4.x;2.5.x;2.6.x修复 cursor.close() 报错的 bug。
td2.0-connector2.0.112.4.x;2.5.x;2.6.x支持绑定参数、json tag、schemaless 接口等功能。
td2.0-connector2.0.102.4.x;2.5.x;2.6.x支持连接管理,普通查询、连续查询、获取系统信息、订阅功能等功能。

REST 连接器

package nameversionTDengine version说明
@tdengine/rest3.0.03.0.0支持 TDegnine 3.0,且不与2.x 兼容。
td2.0-rest-connector1.0.72.4.x;2.5.x;2.6.x移除默认端口 6041。
td2.0-rest-connector1.0.62.4.x;2.5.x;2.6.x修复create,insert,update,alter 等SQL 执行返回的 affectRows 错误的bug。
td2.0-rest-connector1.0.52.4.x;2.5.x;2.6.x支持云服务 cloud Token;
td2.0-rest-connector1.0.32.4.x;2.5.x;2.6.x支持连接管理、普通查询、获取系统信息、错误信息、连续查询等功能。

API 参考

API 参考