从网络抓取数据后,编写阻塞 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) 时获取记录数组中的所有条目
预期代码流
- makeCsv -> 从本地存储读取 csv 并调用函数 getPubKey
- getPubKey-> 通过向 url 和 returns 发出请求,针对 makeCsv 传递的帐户名称的每次调用获取密钥
- makeCsv-> 将键 属性 附加到对象将其推送到结果数组并且 returns 它
- 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));
});
})
}
在 writeFile fn 中,makeCsv 函数返回的记录为空(仍然使用 await :/ empty)如何使 makeCsv 中的所有代码阻塞,以便在调用 fn(makeCsv) 时获取记录数组中的所有条目
预期代码流
- makeCsv -> 从本地存储读取 csv 并调用函数 getPubKey
- getPubKey-> 通过向 url 和 returns 发出请求,针对 makeCsv 传递的帐户名称的每次调用获取密钥
- makeCsv-> 将键 属性 附加到对象将其推送到结果数组并且 returns 它
- 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));
});
})
}