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 awaitcallbacks 一起使用,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 查询一起执行的主要内容,如果未能解决你的问题,请参考以下文章

具有多个查询的NodeJS mysql连接池

使用nodejs在Mysql查询中传递数组

使用 mysql 在 nodejs 中进行分页

使用mysql在nodejs中进行分页

nodejs,express+mysql后台数据查询

MySQL 在 NodeJS 中的重复键更新