使用NodeJS发送Post请求调用API时收到406 Not Acceptable响应的原因
解决Express代理服务器发送FormData报406错误的问题
问题核心
你遇到的406错误本质是请求头Content-Type配置冲突:手动设置的multipart/form-data会覆盖FormData自动生成的带boundary参数的头信息,导致外部API无法正确解析请求体,从而返回406(无法处理请求格式)。
修复步骤
- 移除手动设置的Content-Type
FormData的getHeaders()方法会自动生成包含正确boundary的multipart/form-data头,无需手动添加,否则会造成冲突。 - 改用async/await简化异步逻辑
避免回调嵌套,代码更易维护,同时别忘了给客户端返回响应。
修改后的控制器代码
add: async (req, res) => { try { const data = new FormData(); data.append("trid", ""); data.append("order_no", ""); data.append("customer_name", "Ashutosh"); data.append("customer_email", "ashutosh@gmail.com"); data.append("customer_mobile", ""); data.append("app_id", "2"); data.append("id", ""); data.append("cid", ""); data.append("token", ""); data.append("category", "Administrative"); data.append("sub_category", "General Ticket"); data.append("other", ""); data.append("priority", "High"); data.append("description", "this is description"); data.append("amount", ""); data.append("currency", ""); // data.append("file_1", fs.createReadStream("D6Qe4Dd7b/logo256.png")); const config = { method: "post", url: "https://dev.llp.cpm/api/Saveticket/save", headers: { ...data.getHeaders(), // 直接使用FormData生成的完整请求头 }, data: data, }; const response = await axios(config); console.log(JSON.stringify(response.data)); res.status(200).json(response.data); // 向客户端返回外部API的响应 } catch (error) { console.log("error", error); // 向客户端返回错误信息 res.status(error.response?.status || 500).json({ error: error.message, detail: error.response?.data }); } }
额外排查点
- 若恢复文件上传,确保文件路径正确,且Node.js有读取该文件的权限。
- 可以添加Axios请求拦截器,打印实际发送的请求头,和Postman的请求头对比,确认
boundary参数是否存在:axios.interceptors.request.use(config => { console.log('Request Headers:', config.headers); return config; });
内容的提问来源于stack exchange,提问作者Nafiz Anam
相关产品推荐
相关产品推荐

