MySQL NodeJS:MySQL 查询一起执行
Posted
技术标签:
【中文标题】MySQL NodeJS:MySQL 查询一起执行【英文标题】:MySQL NodeJS: MySQL queries executing together 【发布时间】:2021-01-19 18:46:36 【问题描述】:在下面的Controller.js
文件中,我想让第二个mysql 查询等待第一个查询完成,然后使用第一个查询中存储在foundUser
中的数据。
我很难应用 async await
,因为第二个查询接收到一个空对象,因为它与第一个查询一起执行。
Service.js
addUser: (data) =>
return new Promise((resolve, reject) =>
mysqlpool.query(`insert into requests_team(from_id, to_id)
value(?,?)`,
[
data.from_id,
data.to_id
],
(error, results, fields)=>
if(error)
return reject(error);
return resolve(results);
);
)
,
Controller.js
addUser: async(req, res) =>
const body = req.body;
let errors = ;
let foundUser =
const queryOne = await mysqlpool.query('SELECT id, email FROM registration WHERE email = ?', [body.email], (error, result)=>
if(error)
console.log(error)
if(result.length > 0)
foundUser = result
);
const queryTwo = await mysqlpool.query(`This is where I want to use the value stored in foundUser $foundUser[0].id`, (error, result) =>
if(error)
console.log(error);
addUser(body, (err, results) =>
if(err)
console.log(err);
return res.status(500).json(
success: 0,
message: 'Error'
)
return res.status(200).json(
success: 1
)
)
)
【问题讨论】:
【参考方案1】:这应该可行:
addUser: async (req, res) =>
const body = req.body;
let errors = ;
let foundUser =
const queryOne = await mysqlpool.query('SELECT id, email FROM registration WHERE email = ?', [body.email]);
if (error)
console.log(error)
if (result.length > 0)
foundUser = result
const queryTwo = await mysqlpool.query(`This is where I want to use the
value stored in foundUser $foundUser[0].id`)
// Do stuff with the queryTWo response here
【讨论】:
你好。谢谢您的答复。但是,我试过了,但没有奏效。我根据您的建议更新了上面的代码,因此您可以看看我是否做错了什么。 @Hoopoe_Programming 使用 async/await 时不应使用回调函数。将回调块代码移动到主查询下方,如我的代码所示。虽然我不确定您使用的库是否返回 Promises。 我试过你的代码,但它不起作用。例如,当我尝试在 console.log 中打印 queryOne 时,它没有显示我需要的数据,以便将值分配给 foundUser,因此 queryTwo 可以使用该数据。如果 queryTwo 成功,则数据将被发布到 MySQL。【参考方案2】:问题是您尝试将async await
与callbacks
一起使用,async await 仅适用于承诺或生成器,但这是另一回事。回到主题,你有很多选择来解决这个问题。让我们用最简单的。
node自带一个nodejs模块调用util
,在顶部导入即可
import promisify from "util";
// const promisify = require("util").promisify;
const myCoolVarName = promisify(mysqlpool.query);
//module.exports = async function addUser (req, res)
export async function addUser (req, res)
try
// instead of using mysqlpool and stuff use `myCoolVarName`
// PS: I mean dont have to call it that ... well getting back
const resultQuery1 = await myCoolVarName("SELECT CURRENT_DATE()");
const resultQuery2 = await myCoolVarName("SELECT * FROM table WHERE row = ?", resultQuery1);
return res.sendStatus(200);
catch (err)
return res.status(500).send(message: 'we broke or so')
它应该可以工作,但是如果你想用 mysql 和 node Like the Gods https://medium.com/@enetoOlveda/how-to-connect-expressts-with-mysql-professional-fea43bfa86d3
【讨论】:
是的,这就是我的怀疑。一些库使用 Promise 和回调。这个问题明确提到了承诺。所以我建议他们如何在我的回答中使用 async-await。以上是关于MySQL NodeJS:MySQL 查询一起执行的主要内容,如果未能解决你的问题,请参考以下文章