提问者:小点点

node.js正在等待db查询结果以进行下一步操作


我有一个api代码,如下所示,是通过Node.js编写的。js是异步的,所以下一步在db查询结果之前执行。在那个时候系统还没有得到数据,所以出了错误。我已经搜索了回调结构,承诺和等待,但不能解决它。谢了。

var dateTime = require("node-datetime");
var dt = dateTime.create();
module.exports = {
  myOrderImportFromFileAPI: (req, res) => {
    //let age = req.params.Age;
    // send the player's details to the database

    let userName = req.body.userName;
    let companyID = req.body.companyId;
    let channelId = req.body.channelId;
    let orders = req.body.orders;
    //default values
    let orderTypeId = 1;
    let orderStatusId = 1;
    let createdDate = dt.format("Y-m-d H:M:S");
    let getDate = dt.format("Y-m-d H:M:S");

    db.query(`select ID,Code from operationcenters where CompanyID=${companyID}`, (err, result) => {
      if (err) {
        return res.status(500).send(err);
      }
      var operationCenterId = result[0].ID
      result.find((e) => console.log(e.ID));
    });
    console.log("operationCenterId");
    console.log(operationCenterId);
    console.log("channelId");
    console.log(channelId);
    console.log(orders);

    let query = "select ID value, Name label from channels"
    db.query(query, (err, result) => {
      if (err) {
        return res.status(500).send(err);
      }
      res.send(`1`);
    });
  },
};

共1个答案

匿名用户

const dateTime = require("node-datetime");
const dt = dateTime.create();

const myOrderImportFromFileAPI = async (req, res) => {
  const { userName, companyID, channelId, orders } = req.body
  const orderTypeId = 1;
  const orderStatusId = 1;
  const createdDate = dt.format("Y-m-d H:M:S");
  const getDate = dt.format("Y-m-d H:M:S");

  try {
    const queryData = await queryDatabase()
    res.send(queryData).status(200)
  } catch(error) {
    res.send(error).status(500)
  }
}

function queryDatabase() {
  const query = "select ID value, Name label from channels"

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

像上面这样的安慰会让你上路的。我还没有测试过这个,所以我不能说它100%工作,但这是一个很好的起点。这是因为默认情况下,mysql db不支持异步的现代方式。这就是为什么很多人用蓝鸟(?)这是一个用于创建承诺的库,承诺经常依赖于驱动程序等。因此,您所做的是创建一个异步函数,该函数具有const myOrderImportFromFileAPI=async(req,res)=>;{}之后创建变量,因为您没有重新声明它们,所以使用const函数声明之后的第一行是析构对象。既然我们知道了数据的名称,并将其命名为这样的名称,那么您就可以用它来节省行数,并使其更易于理解。

最后,我们将异步调用包装在try catch语句中,因为我们调用的是一个返回承诺的函数(我们不需要调用nameasync function querydatabase,因为我们没有在内部执行任何异步操作)

在实际函数QueryDatabase中,我们将返回一个解析值result或返回一个被拒绝的值err,该值将在try catch语句中捕获,并发送相应的响应。

我希望这能帮上忙!