You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:06:04