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

如何将form-data与文件从API网关传递至Node.js后端服务API?

问题描述

需要通过API网关将包含文件的form-data请求转发至后端媒体服务,要求网关不做任何预处理,所有文件处理逻辑都在后端完成。流程如下:

Request from user      --->  Api-Gateway     --->  Media service
(form-data + file)         (No processing)          (Process image/video)

尝试使用express-fileupload和multer均未解决问题,当前API网关的核心代码如下:

app.use('/api/ms', async (req: Request, res: Response, next: NextFunction) => {
    try {
        console.log("--------------------- API Gateway -----------------");
        console.log('Request URL:', req.url);
        console.log('Request Method:', req.method);
        console.log('Request Headers:', req.headers);
        console.log('Request Body:', req.body);
        console.log('Request File:', req.files?.file);



        const response = await axios({
            method: req.method,
            url: 'http://media-service:3001' + req.url,
            data: req.body,
            headers: { 'Content-Type': req.headers['content-type'] } // forward Content-Type
        });

        res.json(response.data);

    } catch (error) {
        console.error('Error in API Gateway:', error);
        res.status(500).json({ error: `Media error - ${error}` });
    }
});
解决方案

问题核心在于没有正确转发请求的原始数据流,仅传递req.body会丢失form-data中的文件内容。网关不需要任何文件处理中间件,直接转发原始请求流即可。

修改步骤

  1. 移除所有文件处理中间件(如multer或express-fileupload的配置)
  2. 修改转发逻辑,直接传递原始请求流并完整转发请求头

修改后的代码

app.use('/api/ms', async (req: Request, res: Response) => {
    try {
        console.log("--------------------- API Gateway -----------------");
        console.log('Request URL:', req.url);
        console.log('Request Method:', req.method);
        console.log('Request Headers:', req.headers);

        // 直接转发原始请求流,不解析body
        const response = await axios({
            method: req.method,
            url: 'http://media-service:3001' + req.url,
            data: req, // 传递原始请求流
            headers: {
                // 转发所有请求头,替换host为后端服务地址
                ...req.headers,
                host: 'media-service:3001'
            },
            // 禁用自动解析,保持数据流原始性
            responseType: 'stream'
        });

        // 将后端响应流直接返回给用户
        res.status(response.status);
        response.data.pipe(res);
    } catch (error) {
        console.error('Error in API Gateway:', error);
        res.status(500).json({ error: `Media error - ${error}` });
    }
});

关键说明

  • 不要在网关层解析form-data,直接把req作为axios的data参数,让axios转发原始请求流
  • 转发所有请求头时替换host,避免后端服务识别错误
  • 设置responseType: 'stream',将后端响应流直接pipe到客户端响应,保证数据传输的完整性
  • 如果express中配置了express.json()或express.urlencoded()这类body解析中间件,需确保网关路由不受其影响(比如将网关路由放在这些中间件之前,或改用express.raw())

内容的提问来源于stack exchange,提问作者Deepak Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:33:28