Node-Influx 客户端库入门

导航至

image of long windy road

开始使用 node-influx 的新旅程!

如有疑问,请从头开始——这句格言适用于任何学习之旅,包括开始使用 node-influx 客户端库。让我们看看 InfluxDB 客户端库,特别是 node-influx,一个适用于 JavaScript 用户的 InfluxDB 客户端。此客户端库具有一个简单的 API,用于大多数 InfluxDB 操作,并在 Node 和浏览器中完全受支持,所有这些都无需任何额外的依赖项。

有一个很棒的在线 教程 适用于 node-influx 库,以及一些方便的 文档,我建议您事先通读一下。在这里,我们将仅介绍一些基础知识。

您需要的准备

在本教程中,我将运行 InfluxDB 的本地安装;您可以学习如何 在此处 启动并运行它。您还需要安装 Node。如果 Node.js 不是您的菜,还有很多其他的 客户端库 可供使用,以及一些关于将 InfluxDB 与其他语言一起使用的指南,例如这些关于 PythonRuby 的帖子。

设置场景

Image of two surfers walking into the ocean

如何分配位置

让我们想象一下,您对冲浪有一种莫名的热爱。您发现自己身处夏威夷,追随 杜克 的脚步,并试图找到最佳冲浪地点。以及在上述惊人地点冲浪的最佳时间。查看潮汐是有道理的,对吧?嗯,根据我们可靠的朋友 维基百科,海洋潮汐是时间序列数据的一个很好的例子。它们随着时间涨落(是的,我知道我在这里说得有点过了)。因此,让我们练习使用 node-influx 库将一些示例潮汐数据放入 InfluxDB,看看会发生什么。

首先,我们需要在将要使用的应用程序文件夹中安装 node-influx 库。

$ npm install --save influx

这会将 node-influx 库添加到我们的 node_modules 中;我们还需要像这样将库引入到我们的服务器文件中

const Influx = require('influx');

我们将使用以下 构造函数 连接到单个 InfluxDB 实例并指定我们的连接选项。

const influx = new Influx.InfluxDB({
  host: 'localhost',
  database: 'ocean_tides',
  schema: [
    {
      measurement: 'tide',
      fields: { height: Influx.FieldType.FLOAT },
      tags: ['unit', 'location']
    }
  ]
});

这里有几个不同的选项可用

  • 您可以通过将 DSN 作为字符串传递到构造函数参数中来连接到单个主机,如下所示
const influx = new Influx.InfluxDB('http://user:password@host:8086/database')
  • 您也可以传入一整套配置详细信息,并指定属性,如用户名、密码、数据库、主机、端口和模式 - 这就是我们上面所做的。
  • 如果您有多个 Influx 节点要连接,您可以传入集群配置。例如
    const client = new InfluxDB({
      database: 'my_database',
      username: 'duke_kahanamoku',
      password: 'aloha',
      hosts: [
        { host: 'db1.example.com' },
        { host: 'db2.example.com' },
      ]
      schema: [
        {
          measurement: 'tide',
          fields: { height: Influx.FieldType.FLOAT },
          tags: ['unit', 'location']
        }
      ]
    })

值得在此处注意的是,在您的模式设计中,您将需要使用 Influx.FieldType 为您的字段值指定 FieldType - 它们可以是字符串、整数、浮点数或布尔值。

检查数据库

我们可以使用 influx.getDatabaseNames() 首先检查我们的数据库是否已存在。如果不存在,我们可以使用 influx.createDatabase() 创建我们的数据库。请参见下文

influx.getDatabaseNames()
  .then(names => {
    if (!names.includes('ocean_tides')) {
      return influx.createDatabase('ocean_tides');
    }
  })
  .then(() => {
    app.listen(app.get('port'), () => {
      console.log(`Listening on ${app.get('port')}.`);
    });
    writeDataToInflux(hanalei);
    writeDataToInflux(hilo);
    writeDataToInflux(honolulu);
    writeDataToInflux(kahului);
  })
  .catch(error => console.log({ error }));

我们首先从我们连接的 Influx 实例中获取所有可用的数据库,然后循环遍历返回的数组,看看是否有任何名称与“ocean_tides”匹配。如果没有,那么我们创建一个具有该名称的新数据库。来自该数据库的回调然后将我们的数据写入数据库。

将数据写入 InfluxDB

使用 influx.writePoints(),我们可以将我们的数据点写入数据库。

influx.writePoints([
      {
        measurement: 'tide',
        tags: {
          unit: locationObj.rawtide.tideInfo[0].units,
          location: locationObj.rawtide.tideInfo[0].tideSite,
        },
        fields: { height: tidePoint.height },
        timestamp: tidePoint.epoch,
      }
    ], {
      database: 'ocean_tides',
      precision: 's',
    })
    .catch(error => {
      console.error(`Error saving data to InfluxDB! ${err.stack}`)
    });

为了保持简单,我只拉入了一些示例数据文件,然后按位置循环遍历它们,并将每个数据点写入 measurement 名称 tide 下的 InfluxDB,并带有 locationunit 标签(均为字符串)。这里只有一个字段,height,我也发送了一个 timestamp,虽然这不是技术上必需的(但它更准确)。您可以指定其他选项,例如要写入的数据库、时间精度和保留策略。

查询数据库

我们已经学习了如何将数据写入数据库;现在我们需要知道如何查询该数据。这很简单 - 我们可以使用 influx.query() 并传入我们的 InfluxQL 语句来检索我们想要的数据。

influx.query(`
    select * from tide
    where location =~ /(?i)(${place})/
  `)
  .then( result => response.status(200).json(result) )
  .catch( error => response.status(500).json({ error }) );

在这里,我们正在查询数据库中来自 measurement tide 的任何数据,其中 location 包含传入的地点名称(使用正则表达式)。如果您存储了大量数据,最好也将您的查询限制在一定的时间跨度内。您还可以将 options 对象(数据库、保留策略和时间精度)传递给 influx.query() 方法。

结论

这涵盖了 node-influx 客户端库的所有基础知识。请浏览一下 文档,并告诉我们您还想了解哪些其他用例!我还将所有这些代码发布在 GitHub 上的存储库 中,如果您想亲自尝试一下。有问题和意见?请在 Twitter 上联系我们:@mschae16@influxDB。现在出发,找到那个巨浪,冲浪起来!