在 SQL 查询中使用 Promises?

Using Promises in SQL query?

我有一个 API 调用需要从 MySQL 数据库中获取一些信息才能满足请求。问题是,NodeJS 不会等待查询响应,我已经尝试用 Promises 来解决这个问题。这是我的代码:

    app.post('/placeOrder', async function (req, res) {
  console.log(req.body.orderInfo);
  var username = decryptAccessToken(req.body.AuthToken);
  console.log(username);
  var firstQuery = await fetchCustomerInfo(username, req.body.orderInfo);
   con.query("INSERT INTO Orders SET ?", firstQuery, function (err, response) {
     if (!err) {
      console.log("Order successfully placed");
      res.send("Order successfully placed");
     } else {
       console.log(err);
     }
   });
 });
 async function fetchCustomerInfo(username, orderInfo) {
  return new Promise((resolve, reject) => {
      con.query("SELECT FirstName, LastName, Address, Email, Phone FROM Customers WHERE Email=?", username, function (err, response) {
          var createOrder = {
              FirstName: response.FirstName,
              LastName: response.LastName,
              Address: response.Address,
              Email: response.Email,
              Phone: response.Phone,
              ProductInfoJSON: orderInfo
          }
          console.log(createOrder);
          resolve(createOrder);
      })
  })
}

这个 fetchCustomerInfo 函数将只是 return Promise 对象,这将触发 SQL 语法错误,因为这不是预期的数据库输入。我做错了什么?非常感谢任何建议。

更新:SQL 错误已通过 Murat 的回答得到解决,但数据库查询仍 return 未定义。我已确保手动使用时查询在控制台中有效。

试试这个:



app.post('/placeOrder', async function (req, res) {
    var username = decryptAccessToken(req.body.AuthToken);
    console.log(username);
    var firstQuery = await fetchCustomerInfo(username, req.body.orderInfo);
    con.query("INSERT INTO Orders SET ?", firstQuery, function (err, response) {
        if (!err) {
            console.log("Order successfully placed");
            res.status(200).send("Order successfully placed");
        } else {
            console.log(err);
            res.status(500).send("Error!");
        }
    });
});
function fetchCustomerInfo(username, orderInfo) {
    return new Promise((resolve, reject) => {
        con.query("SELECT FirstName, LastName, Address, Email, Phone FROM Customers WHERE Email=?", username, function (err, response) {
            var createOrder = {
                FirstName: response.FirstName,
                LastName: response.LastName,
                Address: response.Address,
                Email: response.Email,
                Phone: response.Phone,
                ProductInfoJSON: orderInfo
            }
            console.log(createOrder);
            resolve(createOrder);
        })
    })
}

编辑:

由于我对MySql库的使用经验不多,所以在写答案的时候没有检查函数的准确性。但是,您使用 con.query() 的方式是错误的。如果你看看W3 Schools,这才是正确的使用方法。

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});