簡體   English   中英

對節點 stream 使用 async/await 語法

[英]Using async/await syntax with node stream

在此處輸入圖像描述

我在 ubuntu 上使用節點 18.7。 我正在嘗試將一堆 csv 文件解析為對象(使用 csv-parse),最終加載到數據庫中。 因為有大量的這些我決定嘗試流,我想使用異步等待風格。

到目前為止,我有:

const { parse } = require('csv-parse');
const path = __dirname + '/file1.csv';
const opt = { columns: true, relax_column_count: true, skip_empty_lines: true, skip_records_with_error: true };
console.log(path);
const { pipeline } = require('stream');
// const pipeline  = stream.pipeline;


async function readByLine(path, opt) {
    const readFileStream = fs.createReadStream(path);
    var csvParser = parse(opt, function (err, records) {
        if (err) throw err;
    });
    await pipeline(readFileStream, csvParser, (err) => {
        if (err) {
            console.error('Pipeline failed.', err);
        } else {
            console.log('Pipeline succeeded.');
        }
    });
    for await (const record of csvParser) {
        console.log(record);
    }
}

readByLine(path, opt)

當我運行它時,我看到:

Pipeline succeeded.

但是解析的對象不會發送到控制台。 我究竟做錯了什么?

編輯1:

我將代碼更改為:

async function readByLine(path, opt) {
    const readFileStream = fs.createReadStream(path);
    var csvParser = parse(opt, function (err, records) {
        if (err) throw err;
    });
    await pipeline(readFileStream, csvParser, (err) => {
        if (err) {
            console.error('Pipeline failed.', err);
        } else {
            console.log('Pipeline succeeded.');
        }
    });
    // for await (const record of csvParser) {
    //     console.log(record);
    // }
    return csvParser;
}

(async function () {
    const o = await readByLine(path, opt);
    console.log(o);
})();

結果是一個具有一百萬個屬性的 object,但有些屬性看起來像屏幕截圖中的那樣。

您只能await promise 有用。

您正在使用的pipeline function 不會返回 promise。

如果您查看文檔,您將看到:

管道 API 提供了 promise 版本,它還可以接收選項參數作為帶有信號<AbortSignal>屬性的最后一個參數。 當信號中止時,將在底層管道上調用destroy,並帶有AbortError。

 const { pipeline } = require('node:stream/promises'); const fs = require('node:fs'); const zlib = require('node:zlib'); async function run() { await pipeline( fs.createReadStream('archive.tar'), zlib.createGzip(), fs.createWriteStream('archive.tar.gz') ); console.log('Pipeline succeeded.'); } run().catch(console.error);

注意傳遞給require的不同值。 請改用該版本的pipeline

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM