[英]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.