ExpressJS POST请求/test时无法保存API响应至本地JSON文件求助
Node.js POST /test路由无法保存API响应到本地文件的问题排查与修复
核心问题梳理
根据你提供的代码,无法保存API响应的原因主要集中在以下几点:
response变量未赋值真实API响应
在/testPOST分支逻辑中,你直接写入了初始状态的空response对象({data:{}}),完全没有发起API请求获取实际响应数据。form.parse异步处理失效
form.parse是基于回调的异步方法,await对它没有作用,导致data可能还未完成解析就进入后续逻辑,获取不到正确的请求参数。未定义的upload函数调用
代码中调用了upload(req, res, ...),但仅引入了multer库却未初始化上传处理函数,会直接触发运行时错误,中断后续代码执行。axios超时设置错误
axios.defaults.timeout === 20000是相等比较运算符,并非赋值操作,导致超时配置完全不生效。代码结构不完整
现有代码的try块未闭合,app.all回调也缺少响应客户端的逻辑,会导致请求挂起无响应。
修复后的代码示例
const express = require('express'); const cors = require('cors'); const axios = require("axios"); const formidable = require('formidable'); const { MongoClient } = require('mongodb'); const fs = require('fs'); const multer = require("multer"); require('dotenv').config(); // 修正超时赋值逻辑 axios.defaults.timeout = 20000; const app = express(); app.use(cors({ origin: true })); app.use(express.json()); app.use(express.urlencoded()); // 初始化multer上传处理(示例用内存存储,可根据需求修改) const upload = multer({ storage: multer.memoryStorage() }); // MongoDB连接 const connectionString = process.env.DB_ENDPOINT || ""; const mongo = new MongoClient(connectionString); mongo.connect().then(() => { console.log('connected mongo!!!!'); }); app.all("*", async (req, res) => { try { const dbConnect = mongo.db(); // 处理上传(若无需上传可直接删除此段) await new Promise((resolve, reject) => { upload(req, res, function (err) { err ? reject(err) : resolve(); }); }); // 包装form.parse为Promise,等待参数解析完成 const form = new formidable.IncomingForm(); form.encoding = 'utf-8'; const data = await new Promise((resolve, reject) => { form.parse(req, (err, fields) => { err ? reject(err) : resolve(fields); }); }); let response = { data: {} }; const { params, headers } = req; // 创建axios实例 const api = axios.create({ baseURL: process.env.END_POINT, headers: { authorization: headers.authorization || "" } }); if ((req.path === '/test' || req.path === '/test/') && req.method === 'POST') { // 发起API请求获取真实响应 response = await api.post('/实际目标API路径', { ...data, ...req.body }); // 确保存储目录存在,避免写入失败 if (!fs.existsSync('./local')) { fs.mkdirSync('./local', { recursive: true }); } // 写入响应数据到本地文件 fs.writeFileSync(`./local/test.json`, JSON.stringify(response.data)); // 响应客户端 res.status(200).send({ message: "响应已保存", data: response.data }); } else { response = await api.get(req.url, { params: params, data: { ...data, ...req.body } }); res.status(response.status).send(response.data); } } catch (err) { console.error(err); res.status(500).send({ error: err.message }); } }); // 启动服务 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
额外说明
- 替换代码中的
/实际目标API路径为你需要调用的真实API地址; - 若不需要文件上传功能,可直接移除multer相关的初始化和调用代码;
- 新增的目录检查逻辑避免了因
./local目录不存在导致的写入失败; - 完善了错误捕获和客户端响应逻辑,避免请求长时间挂起。
内容的提问来源于stack exchange,提问作者Corey F
相关产品推荐
相关产品推荐

