使用来自多个mysql查询的数据填充对象数组

时间:2017-06-20 13:45:49

标签: mysql node.js express promise async-await

有没有办法暂停迭代map函数,这样我就可以从查询中获得响应并将其存储在某个对象中。

所以我的数据是一个对象数组,我想添加属性"接收器"对于数组中的每个单个对象,所以我使用map功能循环遍历我的数组,问题在于回调:D,我的对象在我的快递发送响应后重新启动数据所以我不得不对Timeout做出反应,我知道它不是正确的解决方案但是它现在有效,因为我在数据库中只有40-50条记录。

以下是代码:

data.map((x) => {

      let sql = `
        SELECT username
        FROM message
        JOIN message2user ON message.message_id = message2user.message_id
        JOIN user on message2user.receiver_id = user.user_id
        where message.message_id = ?;
      `;

      testDB.query(sql, x.message_id, (err, dataReceivers) => {
        if (err) console.log(err);

        x["receivers"] = dataReceivers;
      })

    });


setTimeout(() => {
      res.json({ success: true, data: data });
}, 1000);

我正在使用express用于我的API路由和MySQL模块用于节点,也许我可以使用节点中的Promises或异步函数,我不知道。

你有什么想法吗?

1 个答案:

答案 0 :(得分:3)

如果您不想重构SQL查询,请使用Promises的方法:

const sqlTemplateString = `
SELECT username
FROM message
JOIN message2user ON message.message_id = message2user.message_id
JOIN user on message2user.receiver_id = user.user_id
where message.message_id = ?;
`;

Promise.all(data.map((x) => new Promise((resolve, reject) => {

  testDB.query(sqlTemplateString, x.message_id, (err, dataReceivers) => {
    if (err) {
      reject(err);
    } else {
      x.receivers = dataReceivers;
      resolve(x);
    }
  });

}))).then((data) => {
  res.json({
    success: true,
    data
  });
}).catch((error) => {
  console.log(error);

  res.json({
    success: false,
    error
  });
});

或类似的东西。