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

如何使用NodeJS通过POST请求将本地CSV文件发送至外部API

需求实现方案与代码修正

原代码存在的核心问题

  • 异步执行顺序混乱:json2csv转换、登录请求、上传请求均为异步操作,原代码未等待前序操作完成就执行后续逻辑,会出现文件未生成、token未获取、请求配置未初始化就发起上传的问题
  • 请求头配置错误:手动设置Content-Type: multipart/form-data,会覆盖form-data自动生成的带boundary边界标识的正确请求头,导致第三方API无法正常解析表单数据
  • 冗余磁盘IO:无需将CSV写入本地文件再读取,可直接将转换后的CSV内容传入FormData,性能更高
  • 响应逻辑错误:上传请求还未完成就提前返回了res.json(result.recordsets[0]),会导致后续上传结果无法返回给客户端,同时触发重复响应报错
  • 错误处理不全:各环节异常未捕获并返回给客户端,会导致请求超时无响应

修正后可运行代码

const dbConnect = require('../../config/dbConnect')
const mssql = require('mssql/msnodesqlv8')
const DBConstants = require('../utils/constants')
const dbConfig = require('../../config/database')
const converter = require('json-2-csv')
const axios = require('axios')
const https = require('https')
const FormData = require('form-data')

module.exports.getData = async(req, res) => {
  const httpsAgent = new https.Agent({rejectUnauthorized: false}) 
  try {
    // 1. 从存储过程取数
    const pool = await dbConnect
    const result = await pool.request()
      .input(/* 你的参数配置 */)
      .input(/* 你的参数配置 */)
      .execute(/* 你的存储过程名称 */)

    // 2. 转换数据为CSV格式(直接使用转换结果,不写入本地磁盘)
    const csv = await converter.json2csvAsync(result.recordsets[0])

    // 3. 构造FormData,指定文件名和文件类型为text/csv
    const form_data = new FormData()
    form_data.append('csvFile', csv, {
      filename: 'DATA.csv',
      contentType: 'text/csv'
    })

    // 4. 登录获取token
    const loginRes = await axios.post('/api/v1/user/login', {
      email: 'login_email',
      password: 'login_pass'
    }, { httpsAgent })
    const token = loginRes.data.token

    // 5. 构造上传请求配置
    const request_config = {
      headers: {
        "accept": "application/json",
        "Authorization": "Bearer " + token,
        // 不要手动加Content-Type,form-data的getHeaders会自动生成带boundary的正确值
        ...form_data.getHeaders()
      },
      httpsAgent,
      maxContentLength: Infinity,
      maxBodyLength: Infinity,
    }

    // 6. 发起上传请求
    const uploadRes = await axios.post('/api/v1/amc/upload/', form_data, request_config)

    // 返回上传结果给客户端,可根据业务需要调整返回内容
    res.json(uploadRes.data)
  } catch (err) {
    console.log('操作失败:', err)
    res.status(500).json({
      code: 500,
      msg: '操作失败',
      error: err.message
    })
  }
}

注意事项

  • 生产环境建议关闭rejectUnauthorized: false配置,避免HTTPS校验绕过带来的安全风险
  • 登录用的账号密码建议放到环境变量中管理,不要硬编码在业务代码里
  • 如果确实需要保留本地CSV文件备份,可在CSV转换完成后新增写文件逻辑,注意等待写文件完成后再构造FormData

内容的提问来源于stack exchange,提问作者quadir rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:00