【问题标题】:NodeJS with MySQL - Return blank ArrayNodeJS 与 MySQL - 返回空白数组
【发布时间】:2021-11-18 23:31:44
【问题描述】:

我已经初始化了一个数组“userTasklist”。我已经在 .map 函数中推送了这个数组中的对象。 .map 之后,我有控制台这个数组,但数组是空白的。

比我在 .map 函数中控制对象并且所有值都打印成功,但在 Array 中没有值。不知道为什么。

exports.allUserList = (req, res) => {
    let userID = req.params.userid;
    const ghusersQuery = "SELECT user_id, name, employee_code FROM users WHERE under_gh = ?";
    conn.query(ghusersQuery, [userID], (err, userdata) => {
        if (err) {
            res.send({ message: err })
        } else {
            if (userdata && userdata.length > 0) {
                let userTasklist = [];
                userdata.map((datauser) => {
                    var objtask = {};
                    const userDataQuery = "SELECT * FROM tasklist WHERE user_id = ?";
                    conn.query(userDataQuery, [datauser.user_id], (errnew, taskdata) => {
                        if (taskdata && taskdata.length > 0) {
                            objtask = {
                                userid: datauser.user_id,
                                tasklist: taskdata
                            }
                            userTasklist.push(objtask);
                        }
                    })
                })
                console.log(userTasklist)
                res.send({ message: "user list fetched", userdata: userdata, tasklistdata: userTasklist })
            } else {
                res.send({ message: "Data not found!" })
            }
        }
    })
}

【问题讨论】:

  • userTasklist 在调用查询回调之前发送为空。我建议将运行查询用作Promise,这样您就可以await
  • 你能详细解释一下吗。我是NodeJS的新手
  • 问题是,userDataQuery的函数是在userTasklist之后调用的。在avoiding this so called callback hell 上查看这篇文章:-)

标签: mysql node.js arrays


【解决方案1】:

使用 mysql21 将查询作为 Promise 处理的简化解决方案。

exports.allUserList = async (req, res) => {
  const { userid } = req.params
  const users = await connection.query('SELECT user_id, name, employee_code FROM users WHERE under_gh = ?', [userid])
  if (!users.length)
    return res.send({ message: "Data not found!" })
  
  // better fetch all relevant tasks in bulk
  const tasks = await connection.query('SELECT * FROM tasklist WHERE user_id IN (?)', [users.map(r => r.user_id)])
  res.send({ message: "user list fetched", users, tasks })
}

【讨论】:

  • 如果我需要批量数据,那么我的代码在没有异步和等待的情况下工作正常。我需要单独的数组中的数据。
  • 你能展示一个预期结果的样本吗?您可以在应用程序中重新组织输出,但我通常会避免在循环中调用查询(例如 200 个用户的 200 个查询),因为这可能会导致一些严重的开销。
  • 我在用户表中有组长和团队成员。团队成员每天 3 次添加任务列表 @12PM、3PM 和 6PM。现在组长看到最近 7 天的团队成员任务列表......所以我想先循环 7 天日期并列出在表格顶部,然后我想在下面显示 12PM、3PM 和 6PM 时间日期和之后我想在 的左侧显示登录组头的所有团队成员,这些团队成员从用户数组中获取(第一个查询执行),然后我想显示每个任务列表团队成员分别在 12PM、3PM 和 6PM 的时间......
  • 所以在 React 结束时我有第一个 .map() 函数 7 天,在这个循环中我有另一个用于列表团队成员的第二个 .map() 函数,之后我有第三个 .map()列出任务列表的函数。
猜你喜欢
相关资源
最近更新 更多
热门标签