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

标签 mysql node.js express promise async-await

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

所以我的数据是一个对象数组,我想为数组中的每个对象添加属性“接收器”,所以我使用 map 函数循环遍历我的数组,问题出在回调中:D,我的对象在我之后接收数据express 发送响应,所以我不得不延迟响应超时,我知道这不是正确的解决方案,但它现在有效,因为我在数据库中只有 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);

我正在为我的 API 路由和 MySQL 使用 express Node 的模块,也许我应该使用来自 Node 的 Promises 或异步函数,我不知道。

你有什么想法吗??

最佳答案

如果您不想重构 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
  });
});

或者类似的东西。

关于mysql - 用来自多个 mysql 查询的数据填充对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654871/

相关文章:

javascript - 如何测试expressJS Controller -NodeJS

node.js - 使用带有来自不同 IP 的自签名证书的 https 时出错

mysql - 当不在另一个表中时从一个表中选择用户

mysql - 在 MySQL 中并发创建索引

mysql - 如何在node.js中使用现有的wamp的MySQL数据库?

javascript - 尝试代理到 : localhost:4200/api/v1/generate_uid 时发生错误

javascript - Angular - 意外的标记 <

php - 从一个表中选择不在另一个表中但具有特定条件的记录

php - 将日期从 PDO 传递到 MySQL 存储过程

javascript - 从 NodeJS 执行 python 脚本