TDengine Node.js Connector

    @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 语言编译器, 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

    • 安装方法 2

    手动安装以下工具:

    • 安装 Visual Studio 相关: 或者 Visual Studio 2017 Community
    • 安装 2.7(v3.x.x 暂不支持) 并执行 npm config set python python2.7
    • 进入cmd命令行界面,npm config set msvs_version 2017

    参考微软的 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/rest
    • 原生连接器
    • REST 连接器

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

    验证方法:

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

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

    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 包。

    安装并引用 @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 conn = taos.connect({
    2. host: "localhost",
    3. });
    4. const cursor = conn.cursor();
    5. try {
    6. cursor.execute("CREATE DATABASE power");
    7. cursor.execute("USE power");
    8. cursor.execute(
    9. "CREATE STABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT)"
    10. );
    11. 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)
    12. power.d1002 USING power.meters TAGS('California.SanFrancisco', 3) VALUES ('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000)
    13. 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)
    14. 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)`;
    15. cursor.execute(sql,{'quiet':false});
    16. } finally {
    17. cursor.close();
    18. conn.close();
    19. }
    20. // run with: node insert_example.js
    21. // Successfully connected to TDengine
    22. // Query OK, 0 row(s) affected (0.00509570s)
    23. // Query OK, 0 row(s) affected (0.00130880s)
    24. // Query OK, 0 row(s) affected (0.00467900s)
    25. // Query OK, 8 row(s) affected (0.04043550s)
    26. // 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 行协议写入

    • 原生连接

    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. insertData();
    29. } finally {
    30. cursor.close();
    31. conn.close();
    32. }

    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 |

    查看源码

    更多示例程序

    使用限制

    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

    重要更新记录

    原生连接器

    API 参考