【问题标题】:MySQL NodeJS: MySQL queries executing togetherMySQL NodeJS:MySQL 查询一起执行
【发布时间】: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
        })
        })
    })
}

【问题讨论】:

    标签: javascript mysql node.js api asynchronous


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多