Node.js遍历CSV行写入JSON仅保留最后一条API响应 如何实现追加写入
问题原因
fs.writeFileSync默认是覆盖写入模式,每次调用都会清空文件原有内容再写入新内容,所以最终只会保留最后一次的写入结果- 循环内的异步请求没有做顺序控制,多个异步写入同时触发还容易出现文件写入冲突
- 现有代码的状态判断逻辑错误,请求成功返回200状态时反而会抛出异常
解决方案
推荐先批量收集所有API响应结果,最后一次性写入为合法的JSON数组,避免逐行追加导致的JSON格式错乱问题,修正后代码如下:
const fs = require('fs').promises; // 用promise版fs更方便异步处理 const path = require('path'); const neatCsv = require('neat-csv'); // read csv file const filePath = path.join(__dirname, 'shipmentId.csv'); fs.readFile(filePath) .then(async data => { const parsedData = await neatCsv(data); // 用来存储所有响应结果 const allResponse = []; // 顺序执行所有请求,避免并发过高 for (const rowObj of parsedData) { const id = rowObj.ShipmentId; const mwsRequestData = { Version: '2010-10-01', Action: 'ListInboundShipmentItems', SellerId: config.SellerId, MWSAuthToken: config.MWSAuthToken, ShipmentId: id, }; try { const response = await mws.fulfillmentInboundShipment.search(mwsRequestData); // 修正状态判断逻辑,不等于200才抛错 if (response.status !== 200) { throw new Error(`Unexpected status code ${response.status}, expected 200`); } console.log('请求成功,ShipmentId:', id); // 把响应存入数组 allResponse.push(response); } catch (err) { console.log(`ShipmentId为${id}的请求失败:`, err); } } // 所有请求完成后一次性写入文件 await fs.writeFile('todo2.json', JSON.stringify(allResponse, null, 2)); console.log('所有结果已写入完成'); }) .catch(error => { console.log('读取文件失败:', error); });
如果你确实需要逐次追加写入(比如数据量极大内存装不下),可以改用fs.appendFileSync,但要注意提前写入数组开头的[,每次写完追加逗号,最后写入]保证JSON格式合法,操作起来相对麻烦,非必要不推荐。
内容的提问来源于stack exchange,提问作者nicobird
相关产品推荐
相关产品推荐

