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

二次请求服务器后代码无法执行问题求助

问题分析与解决

核心问题

你通过$.post发起两次嵌套请求时,第二次请求能正常返回数据,但回调函数无法执行,根源是语法错误:你将$.post调用与回调函数用逗号分隔,导致回调并未绑定到请求的成功事件上。

错误代码定位

你第二次$.post的写法存在语法问题:

$.post("/setImg", {
    path: path
}),
function (res){
    // 无法执行
    console.log(JSON.parse(JSON.stringify(res)));
}

这里的逗号属于语法错误,回调函数没有作为$.post的第三个参数传入,而是变成了独立表达式,自然不会被触发执行。

修复后的前端代码

将回调函数放入$.post的参数列表内即可:

$("#start_search").click(function () {
    $.post("/getLinks", {
            searchText: $('#searchText').val(),
            picSize: $('input[name="pic"]:checked').val(),
            typeFile: $('input[name="file"]:checked').val(),
            clicks: $('#numberOfPics').val()
    },
    function (data) {
        console.log('Done!')
        let json = JSON.parse(JSON.stringify(data));
        for (let arr of json[0].arrs){
            for (let path of arr[0]){
                // 修正:将回调作为$.post的第三个参数传入
                $.post("/setImg", {
                    path: path
                }, function (res){
                    console.log(JSON.parse(JSON.stringify(res)));
                });
            }
        }
    });
});

额外优化建议

  • 避免回调地狱:嵌套请求过多时,可用async/await结合Promise改写,代码逻辑更清晰:
$("#start_search").click(async function () {
    try {
        // 用Promise封装第一次请求
        const data = await $.post("/getLinks", {
            searchText: $('#searchText').val(),
            picSize: $('input[name="pic"]:checked').val(),
            typeFile: $('input[name="file"]:checked').val(),
            clicks: $('#numberOfPics').val()
        });
        console.log('Done!')
        let json = JSON.parse(JSON.stringify(data));
        for (let arr of json[0].arrs){
            for (let path of arr[0]){
                const res = await $.post("/setImg", { path: path });
                console.log(JSON.parse(JSON.stringify(res)));
            }
        }
    } catch (err) {
        console.error('请求出错:', err);
    }
});
  • 修复SQL注入风险:你的后端代码直接拼接字符串生成SQL,极易遭受注入攻击,需改为参数化查询:
// 示例:参数化查询写法
connection.query('INSERT INTO imgs (filepath) VALUES (?)', [filepath], (err, results) => {
    if (err) return callback(err);
    // 后续逻辑
});

createObject函数内的SQL语句也需同步修改为参数化形式。

  • 完善错误响应:后端/setImg接口在出错时仅打印错误,未向前端返回错误信息,需补充状态码与错误响应:
app.post("/setImg",  (req, res) => {
    let filepath = req.body.path;
    BD.start(filepath, function (err, result) {
        if (err) {
            console.log(err);
            return res.status(500).json({ error: err.message }); // 返回错误响应
        }
        res.json([{
            result: result
        }])
    })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:21