gpt4 book ai didi

mysql - 在依赖于顺序响应的 MySQL 的两个查询之间注入(inject) API 调用

转载 作者:行者123 更新时间:2023-11-29 06:28:43 25 4
gpt4 key购买 nike

在我的后端 Node.js Express API 上,我需要连接到 MySQL 数据库,运行查询以获取一些信息。然后使用该信息调用外部 API。最后,在获得响应后,我需要在对数据库的第二次查询中使用外部信息。

我有一个函数当前可以完成所描述的任务,但在我的 Chrome 开发工具中,请求从未标记为已解决。这导致我在前端的 promise 永远不会继续到其链中的下一个函数。

app.get('/api/update/:id', (req, res) => {
const ID = req.params.id;
connectionPool.getConnection((err, connection) => {
if (err) {throw err;}
const queryA = `SELECT infoA FROM table WHERE id = "${ID}"`;
connection.query(queryA, (error, results, fields) => {
const infoA = results[0].infoA;
externalAPICall(infoA).then(res => {
let infoB = res;
const queryB = `UPDATE table SET infoB = "${infoB}" WHERE id = "${ID}"`;
connection.query(query);
connection.release();
});
});
})
})

然后在前端,向此 API 路由发送请求

updateInfo = (id) => {
axios.get(`${API_ROOT}/api/update/${id}`)
.then(res => {
this.getAllInfo();
});
}

我希望前端触发对api/update/id路由的请求,并从数据库中选择infoA,用于信息B的外部API调用,然后更新infoB 进入数据库。前端收到完成后的确认后,它将运行一个函数来查询完整的表,并在 getAllInfo 函数中更新信息。

现在,我的表成功地从外部 API 更新了自身,但是前端没有收到来自 API 的响应,因此它似乎永远不会继续进行 getAllInfo 函数调用。我尝试过将 res.status(200).send(results) 放入我的 API 路由中,但是如果太早,或者如果它正好在最后,那么要么最终会破坏链条,要么在最后给出错误提示 res 未定义。

我觉得我错过了一些非常小的东西,可以让这一切顺利进行。

最佳答案

您没有从请求处理程序发送任何响应。当请求处理程序代码完成其工作时,您需要 res.send(...)res.json(...)

并且,您需要更改其中的参数:

externalAPICall(infoA).then(res => { ...});

res 以外的某个参数名称,因为它隐藏了您需要与 res.send() 一起使用的更高范围的 resres.json()

你可以这样做:

app.get('/api/update/:id', (req, res) => {
const ID = req.params.id;
connectionPool.getConnection((error, connection) => {
if (error) {
console.log(err);
res.sendStatus(500);
return;
}
const queryA = `SELECT infoA FROM table WHERE id = "${ID}"`;
connection.query(queryA, (error, results, fields) => {
if (error) {
console.log(err);
res.sendStatus(500);
return;
}
const infoA = results[0].infoA;
externalAPICall(infoA).then(infoB => {
const queryB = `UPDATE table SET infoB = "${infoB}" WHERE id = "${ID}"`;
connection.query(query, (error, results, fields) => {
if (error) {
console.log(err);
res.sendStatus(500);
} else {
res.send("success");
}
connection.release();
});

});
});
})
})

注意:如果您在 mysql2 接口(interface)中使用 Promise 接口(interface),这可以使代码更加简洁,可以集中处理错误并进行维护。

关于mysql - 在依赖于顺序响应的 MySQL 的两个查询之间注入(inject) API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830310/

25 4 0
文章推荐: mysql - 更正 sum 函数语法错误中的子查询
文章推荐: java - 使用 java 流将 Stream 转换为 List