从网络抓取数据后,编写阻塞 Js 代码以写入 = csv 文件(使用 csv-parser)

Write Blocking Js code to write = csv file (using csv-parser) after scraping data from web

在 writeFile fn 中,makeCsv 函数返回的记录为空(仍然使用 await :/ empty)如何使 makeCsv 中的所有代码阻塞,以便在调用 fn(makeCsv) 时获取记录数组中的所有条目
预期代码流

  1. makeCsv -> 从本地存储读取 csv 并调用函数 getPubKey
  2. getPubKey-> 通过向 url 和 returns 发出请求,针对 makeCsv 传递的帐户名称的每次调用获取密钥
  3. makeCsv-> 将键 属性 附加到对象将其推送到结果数组并且 returns 它
  4. writeFile -> 调用 makeCsv 并使用数组写入包含键的新 Csv

    问题: 一旦调用 getPubkey 函数,就会触发结束事件,用空数组解析承诺,因此 writeFile 收到空数组,因为它在 makeCsv 结束创建所有请求然后添加密钥之前运行到数据对象

代码

const csv = require('csv-parser')
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const fetch = require('node-fetch');
const fs = require('fs');
let nkas = []

async function makeCsv(results) {
    const readable = fs.createReadStream('/home/vector/Desktop/test.csv')
    return new Promise((resolve, reject) => {
        readable.pipe(csv(['acc', 'balance']))
            .on('data', async (data) => {
                data.key = await getPubkey(data.acc)
                results.push(data)
            })
            .on('end', () => {
               return resolve(results);
            });
    })
}

async function getPubkey(account) {
    const body = { account_name: account }
    let key;
    await fetch('https://eos.greymass.com/v1/chain/get_account', {
        method: 'post',
        body: JSON.stringify(body),
        headers: { 'Content-Type': 'application/json' },
    })
        .then(res => res.json())
        .then(json => key = json.permissions[1].required_auth.keys[0].key)
        .catch(err => console.log(err))
    if (key && key.length > 0)
        return key
    else
        nkas.push(account);
    console.log(nkas);

}

async function writeFile() {
    const csvWriter = createCsvWriter({
        path: 'out.csv',
        header: [
            { id: 'acc', title: 'Account' },
            { id: 'balance', title: 'Balance' },
            { id: 'key', title: 'PubKey' }
        ]
    });
    let records = []
    records = await makeCsv(records)
    console.log(records)
    csvWriter.writeRecords(records)       // returns a promise
        .then(() => {
            console.log('...Done');
        });
}
writeFile();

在解决 makeCsv() 承诺之前,您需要等待 getPubKey() 承诺解决:

async function makeCsv() {
    const readable = fs.createReadStream('/home/vector/Desktop/test.csv')
    const pending = [];
    return new Promise((resolve, reject) => {
        readable.pipe(csv(['acc', 'balance']))
            .on('data', (data) => {
                const getKey = async (data) => {
                    data.key = await getPubkey(data.acc)
                    return data
                }
                pending.push(getKey(data))
            })
            .on('end', () => {
                Promise.all(pending).then(results => resolve(results));
            });
    })
}