二次请求服务器后代码无法执行问题求助
问题分析与解决
核心问题
你通过$.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
相关产品推荐
相关产品推荐

