节点MySQL异步执行查询

时间:2018-07-07 09:01:48

标签: mysql node.js express

我有以下Node / Express路由,用于将数据发布到MySQL服务器。它首先将一个新用户添加到表中,然后获取新用户的ID,并将更多信息添加到配置文件表中。第二个查询依赖于第一个查询,因此它们按顺序运行。

我编写了以下代码,它可以正确运行并完成工作。

routes.post('/register', (req,res) => {
  console.log('api req: ', req.body)
  const email = req.body.email
  const password = 'test'// req.body.password
  if (!email || !password) return res.status(400).json({type: 'error', message: 'Please provide email and password'})
  const hash = bcrypt.hash(password, 10)
  // console.log('hash is ...', hash )
  var sqlquery = "INSERT INTO user (username, first_name, last_name, email, password) VALUES ('test@gmail.com', 'Dan', 'Brown', 'test@gmail.com', 'test')"

  db.query(sqlquery, (error, results) => {
    if (error) return res.status(400).json({type: 'error', message: error})
    if (results.length == 0) {
      // do something
    } else {
      // run another query based on results from previous query
      var profilequery = "INSERT INTO userprofile (user_id, address, age) VALUES (" + results.insertId + ", 'test address', 25)"
      db.query(profilequery, (error1, results1) => {
        if (error) return res.status(400).json({type: 'error1', message: error1})
        console.log("profile inserted, ID: " + results1)
      })
    }
    console.log("1 record inserted, ID: " + results.insertId);
    res.json({type: 'success', message: 'user registered', results})
    return results
  })
})

有两个问题:

问题1:该代码不是异步的。我想在此代码上使用async / await。非常感谢有人能帮助我将其转换为异步代码。

问题2:我尝试使用bcrypt哈希密码。但是,如果我在查询中使用哈希值,则查询失败,因为bcrypt返回一个Promise,而不是实际的哈希密码。我解决这个问题。

1 个答案:

答案 0 :(得分:0)

未测试:

    asyncQuery = (query, args) => {
    return new Promise((resolve, reject) => {
        db.query(query, function (err, result, fields) {
            if (err)
                return reject(err);
            resolve(result);
        });
    });
}

routes.post('/register', (req, res) => {
    console.log('api req: ', req.body)
    const email = req.body.email
    const password = 'test'// req.body.password
    if (!email || !password) return res.status(400).json({ type: 'error', message: 'Please provide email and password' })
    const hash = bcrypt.hash(password, 10)
    // console.log('hash is ...', hash )

    const sqlquery = "INSERT INTO user (username, first_name, last_name, email, password) VALUES ('test@gmail.com', 'Dan', 'Brown', 'test@gmail.com', 'test')"

    let firstresult, secondresult;
    asyncQuery(sqlquery)
        .then(rows => {
            firstresult = rows;
            const profilequery = `INSERT INTO userprofile (user_id, address, age) VALUES ("${rows.insertId}", 'test address', 25)`;
            return asyncQuery(profilequery)
        })
        .then(rows => {
            secondresult = rows; 
        })
        .then( () => {
            console.log(`firstresult:${firstresult}`)
            console.log(`firstresult:${secondresult}`)

            res.json({ type: 'success', message: 'user registered', results })
        })
        .catch(rows => {
            console.log(`Error:${rows}`)
        })
})