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

Firebase Functions中GET请求调用AWS SQL服务器持续返回400格式错误/非法请求问题求助

问题根源分析与解决方案

你的GET请求返回400错误的核心原因是HTTP GET请求不应该携带请求体(body),虽然部分客户端工具允许这种操作,但绝大多数服务器框架(包括你用的Express)会直接拒绝这类不符合规范的请求,返回"格式错误"的400状态码。再加上后端代码错误地尝试从GET请求中读取body,进一步加剧了问题。

一、Firebase Functions端的修改

把原本放在body里的参数转移到URL的查询字符串(query string)中,这是GET请求传递参数的标准方式:

exports.getPosts = functions.https.onRequest(async(data,context) => { 
    //checkAuth(context); 
    const followingQuery = await db.collection('users').doc('uRPCxsfZDnWoCnvhUSInlUFkQVf2').collection('followed-livestreams').get(); 
    let usersFollowing = []; 
    for(let i = 0; i < followingQuery.docs.length; i++) { 
        usersFollowing.push(followingQuery.docs[i].id); 
    } 
    const options = { 
        method: 'GET', 
        uri: 'URL FOR HANDLING REQUEST',
        // 使用qs传递GET参数,数组需要序列化
        qs: {
            followingList: JSON.stringify(usersFollowing),
            sortByPopularity: true
        },
        json: true // 保持这个,自动处理响应的JSON解析
    }; 
    try { 
        const body = await rp(options); 
        console.log(body);
        // 别忘了给Firebase Functions的请求返回响应!你原来的代码没返回任何内容
        return { statusCode: 200, body: JSON.stringify(body) };
    } catch(e) { 
        console.log(e); 
        return { statusCode: 500, body: JSON.stringify({ error: e.message }) };
    } 
});

注意:你原来的函数没有向客户端返回任何响应,这会导致请求超时,一定要加上return语句返回HTTP响应。

二、后端Express接口的修改

后端需要从req.query中获取GET参数,而不是req.body,同时修复几个隐藏的bug:

post.get("/", (req, res) => { 
    // 跨域头部保留
    res.header("Access-Control-Allow-Origin", "URL YOU ARE MAKING THE REQUESTS FROM"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    res.header("Access-Control-Allow-Methods","GET, POST, DELETE, PATCH"); 
    res.header('Content-type', 'application/json;charset=utf-8') 

    try {
        // 解析查询参数:数组需要反序列化,布尔值要转成实际的boolean类型
        const followingList = JSON.parse(req.query.followingList || '[]');
        const sortByPopularity = req.query.sortByPopularity === 'true';

        console.log('Received followingList:', followingList);
        console.log('Sort by popularity:', sortByPopularity);

        let sqlStr;
        let queryParams = [];

        if(followingList.length > 0) {
            // 使用参数化查询避免SQL注入风险!
            const placeholders = followingList.map(() => '?').join(',');
            const sortField = sortByPopularity ? 'reactionPoints DESC' : 'posted DESC';
            sqlStr = `SELECT * from News_Feed.Posts WHERE posterId IN (${placeholders}) ORDER BY ${sortField};`;
            queryParams = followingList;
        } else {
            // 没有关注列表时的默认查询逻辑
            sqlStr = "SELECT * from News_Feed.Posts;";
        }

        _conn.query(sqlStr, queryParams, (err, result, fields) => { 
            if (err) {
                console.error('Database query error:', err);
                return res.status(500).json({ error: 'Failed to fetch posts' });
            }
            // 用map简化数组转换
            const finalResult = result.map(item => ({
                id: item.id,
                posterId: item.posterId,
                posterName: item.posterName,
                posterPicture: item.posterPicture,
                posted: item.posted,
                type: item.type,
                url: item.url,
                text: item.text,
                reactionPoints: item.reactionPoints,
                fiveCount: item.fiveCount,
                commentCount: item.commentCount,
            }));
            console.log(finalResult);
            res.json(finalResult); 
        });
    } catch (parseErr) {
        console.error('Parameter parsing error:', parseErr);
        return res.status(400).json({ error: 'Invalid request parameters' });
    }
});

三、关键修复点说明

  1. GET请求参数传递规范:彻底放弃在GET请求中使用body,改用query string传递参数,符合HTTP标准。
  2. 参数解析逻辑:后端从req.query读取参数,处理数组的序列化/反序列化,以及布尔值的类型转换。
  3. SQL注入防护:使用参数化查询替代字符串拼接,避免恶意SQL注入攻击。
  4. 错误处理:增加了参数解析错误和数据库查询错误的捕获,返回更清晰的错误信息。
  5. Firebase Functions响应:补充了函数的返回响应,避免请求超时。

内容的提问来源于stack exchange,提问作者Dean Packard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:42:27