如何使用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
相关产品推荐
相关产品推荐

