快速开始使用还原店JavaScript SDK
#教程 #node #database #reductstore

此快速启动指南将引导您完成安装和使用还原店JavaScript客户端SDK与ReductStore实例进行交互的过程。

安装SDK

要安装还原SDK,您需要在计算机上安装Node.js 16或更高版本。安装了node.js后,您可以使用npm软件包管理器安装reduct-js软件包:

npm install reduct-js

作为Docker容器运行还原设备

如果您尚未运行还原的实例,则可以轻松地将一个实例旋转为Docker容器。为此,运行以下命令:

docker run -p 8383:8383 reductstore/reductstore

这将在您本地计算机的端口8383上启动一个还原店实例。

使用SDK

现在,您已经安装了reduct-js SDK并运行了还原店实例,您可以开始使用SDK与还原店实例进行交互。

这是使用JavaScript SDK在存储桶上执行一些不同操作的示例:

const {Client, QuotaType} = require("reduct-js");
const fs = require("fs");

const main = async () => {
    // Create a client
    const client = new Client("http://127.0.0.1:8383");

    // Get or create a bucket with 1Gb quota
    const bucket = await client.getOrCreateBucket("my-bucket",
        {quotaType: QuotaType.FIFO, quotaSize: BigInt(1e9)}
    );

    // The simplest case. Write some data with the current timestamp
    let record = await bucket.beginWrite("entry");
    await record.write("Hello, world!");

    // More complex case. Upload a file as a stream with a custom timestamp unix timestamp in microseconds
    const timestamp = Date.now() * 1000;
    record = await bucket.beginWrite("entry", timestamp);
    const fileStream = await fs.createReadStream(__filename);   // let's upload this file
    await record.write(fileStream, fs.statSync(__filename).size);

    // The simplest case. Read the data by a certain timestamp
    record = await bucket.beginRead("entry", timestamp);
    console.log(await record.readAsString());

    // More complex case. Iterate over all records in the entry and read them as steams
    function streamToString (stream) {
        const chunks = [];
        return new Promise((resolve, reject) => {
            stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
            stream.on("error", (err) => reject(err));
            stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
        });
    }

    for await (const record of bucket.query("entry")) {
        console.log(`Record timestamp: ${record.timestamp}`);
        console.log(`Record size: ${record.size}`);

        // Read the record as a stream
        await streamToString(record.stream);
    }

};

main().catch(e => console.error(e));

让我们分解这个示例在做什么。

创建客户

要开始与数据库进行交互,我们需要创建一个客户端。您可以使用reduct模块的Client类。将要连接到的还原实例的URL传递给Client构造函数:

// Create a client
const client = new Client("http://127.0.0.1:8383");

创建一个水桶

还原商店中的所有数据都存储在存储桶中。要获取一个存储桶,您可以在AClient上使用getOrCreateBucket方法。如果尚不存在,则该方法会创建一个存储桶。传递要与存储桶设置一起创建的存储桶的名称。在此示例中,我们正在创建一个具有1GB配额的存储桶。这意味着数据库将
一旦存储桶达到1GB,就开始删除旧数据:

// Get or create a bucket with 1Gb quota
const bucket = await client.getOrCreateBucket("my-bucket",
    {quotaType: QuotaType.FIFO, quotaSize: BigInt(1e9)}
);

将数据写入水桶

要将数据写入存储桶,您可以在Bucket实例上使用beginWritemethod。传递您
条目的名称 想写。 beginWrite方法返回一个可以用来将数据写入存储桶的WritableRecord对象。如果未指定该条目,则beginWrite方法将使用当前时间作为时间戳:

// The simplest case. Write some data with the current timestamp
let record = await bucket.beginWrite("entry");
await record.write("Hello, world!");

WritableRecord.write方法接受ReadbleStream对象作为参数,因此您可以使用它来从文件或任何其他来源编写数据:

const timestamp = Date.now() * 1000;
record = await bucket.beginWrite("entry", timestamp);
const fileStream = await fs.createReadStream(__filename);   // let's upload this file
await record.write(fileStream, fs.statSync(__filename).size);

请注意write方法必须提前了解书面数据的大小。

从水桶读取数据

要从存储桶中读取数据,您可以在Bucket实例上使用beginRead方法。传递您要阅读的条目的名称和时间戳。 beginRead方法返回一个ReadableRecord对象,其中包含有关记录和方法read的信息来读取内容:

// The simplest case. Read the data by a certain timestamp
record = await bucket.beginRead("entry", timestamp);
console.log(await record.readAsString());

要在存储桶中的所有条目上迭代,您可以在Bucket实例上使用query方法:

// More complex case. Iterate over all records in the entry and read them as steams
function streamToString (stream) {
    const chunks = [];
    return new Promise((resolve, reject) => {
        stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
        stream.on("error", (err) => reject(err));
        stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
    });
}

for await (const record of bucket.query("entry")) {
    console.log(`Record timestamp: ${record.timestamp}`);
    console.log(`Record size: ${record.size}`);

    // Read the record as a stream
    await streamToString(record.stream);
}

在此示例中,我们迭代了存储桶中的所有条目,并将其读为流。但是,您可以使用start
stop参数以指定要检索的记录的时间间隔。 start参数指定时间间隔的开始,而stop参数指定时间间隔的结束。这两个论点都是Unix微秒中的时间戳:

const startTs = 1609459200000000  // January 1, 2021 at 00:00:00
const stopTs = 1609827200000000   // January 31, 2021 at 23:59:59
for await (const record of bucket.query("entry", startTs, stopTs)) {
    console.log(`Record timestamp: ${record.timestamp}`);
    console.log(`Record size: ${record.size}`);
    console.log(`Record content: ${await record.read()}`);
    //...
}

下一步

既然您对还原商店的工作原理有了基本的了解,则可以在项目中开始使用它。你可以找到
有关还原店JavaScript SDK here的更多信息。

如果您有任何疑问或反馈,请随时在Discord
接触 或通过关于GitHub的讨论。