【发布时间】:2019-06-03 11:43:13
【问题描述】:
我的用例如下。我有一个 node.js 应用程序,它使 API 调用受到外部库 limiter 的限制。然后,我以每秒 27 次调用的速率进行 API 调用,直到完成对包含我需要传递给 API 的一个参数的整个数组的循环。一旦我从 API 获得响应,我想将此数据保存在 csv 文件中。
我的想法是在从 API 获得结果后逐行编写 csv 文件。我为此使用csv-writer。
根据文档
"你可以通过多次调用 writeRecords 将记录继续写入同一个文件(但需要等待上一次 writeRecords 调用的 promise 实现)。"
Promise.resolve()
.then(() => csvWriter.writeRecords(records1))
.then(() => csvWriter.writeRecords(records2))
我也一直在考虑尝试让代码等到 API 调用完成并提示写入 csv 文件,但是,我不知道该怎么做。我在网上找不到任何类似的例子。所有这些似乎都是从一个对象/数组开始的。即使文档中没有建议,我也尝试为抛出的任何异常添加捕获。类似的东西。
Promise.resolve()
.then(() => csvWriter.writeRecords(outp))
.catch(err => console.log(err))
这是我的代码:
var RateLimiter = require('limiter').RateLimiter;
const createCsvWriter = require('csv-writer').createArrayCsvWriter;
var limiter = new RateLimiter(27, 'second', true);
let final = [xxxxxxxx, xxxxxxx, ..... ]
const csvWriter = createCsvWriter({
header: ['NAME'],
path: 'out.csv'
});
let outp = []
final.forEach((item, index) => {
//limit the API calls according to the limiter defined above
limiter.removeTokens(1, () => {
ExternalAPIcall({ number: item}, (error, response) => {
if (error) {
console.error(error)
} else {
console.log(response.status_message)
output.push(response.status_message)]
const records = output.map(NAME => [NAME])
csvWriter.writeRecords(records)
}
})
})
})
我希望文件是逐行写入的,然后我可以使用 append:true 来覆盖文件,如果需要,如文档中所示。但是,会抛出此错误。
(node:3540) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:86) (节点:3540)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“地图” 在 ArrayCsvStringifier.getCsvLine (/Users/xxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-stringifiers/abstract.js:19:14) 在 Array.from.record (/Users/xxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-stringifiers/abstract.js:14:61) 在 Function.from (本机) 在 ArrayCsvStringifier.stringifyRecords (/Users/xxxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-stringifiers/abstract.js:14:32) 在 CsvWriter。 (/Users/xxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-writer.js:24:55) 在 Generator.next () 在 /Users/xxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-writer.js:7:71 在新的承诺 () 在 __awaiter (/Users/xxxxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-writer.js:3:12) 在 CsvWriter.writeRecords (/Users/xxx/Desktop/nodexcel/node_modules/csv-writer/dist/lib/csv-writer.js:22:16) (节点:3540) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:88)
感谢您的宝贵时间。
问候, J.
已解决: 问题是 writeRecords 期待 > like Array> 并且我正在传递一个数组。 https://github.com/ryu1kn/csv-writer/blob/86a57cae5d68f91d738318aff1de3b6d55d6b718/README.md#csvwriterwriterecordsrecords,这个位解决了。
const 记录 = llenar.map(NAME => [NAME]) csvWriter.writeRecords(记录)
我已经更新了上面的代码
【问题讨论】: