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

ExpressJS POST请求/test时无法保存API响应至本地JSON文件求助

Node.js POST /test路由无法保存API响应到本地文件的问题排查与修复

核心问题梳理

根据你提供的代码,无法保存API响应的原因主要集中在以下几点:

  1. response变量未赋值真实API响应
    在/test POST分支逻辑中,你直接写入了初始状态的空response对象({data:{}}),完全没有发起API请求获取实际响应数据。

  2. form.parse异步处理失效
    form.parse是基于回调的异步方法,await对它没有作用,导致data可能还未完成解析就进入后续逻辑,获取不到正确的请求参数。

  3. 未定义的upload函数调用
    代码中调用了upload(req, res, ...),但仅引入了multer库却未初始化上传处理函数,会直接触发运行时错误,中断后续代码执行。

  4. axios超时设置错误
    axios.defaults.timeout === 20000是相等比较运算符,并非赋值操作,导致超时配置完全不生效。

  5. 代码结构不完整
    现有代码的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:07:08