Получение ошибки асинхронного ожидания и пустого значения в массиве

#mysql #node.js #async-await #array.prototype.map

Вопрос:

Я получаю следующую ошибку:

Синтаксическая ошибка: ожидание допустимо только в асинхронной функции

Также я получил пустой массив «console.log(userTasklist)».

 const mysql = require('mysql2/promise');
    // create the connection to database
    const connection = async ()=> { 
        return await mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'whosin'
        })
    }
exports.allUserList = async (req, res) => {
    const db = await connection()
    let userID = req.params.userid;    
    
    const userdata = await db.query('SELECT name, user_id, employee_code FROM users WHERE under_gh = ?', [userID]);
    //console.log(userdata[0])
    
        if (userdata[0] amp;amp; userdata[0].length > 0) {
            let userTasklist = [];
            userdata[0].map((datauser) => {
                var objtask = {};
                const taskdata =  await db.query("SELECT DATE_FORMAT(created_date, '%Y-%m-%d') as created_date, created_time, tasklist, user_id, DATE_FORMAT(created_by, '%Y-%m-%d') as date, DATE_FORMAT(created_by, '%H:%i:%s') as time FROM tasklist where user_id = ?", [datauser.user_id]);
               
                    if (taskdata[0] amp;amp; taskdata[0].length > 0) {
                        objtask = {
                            userid: datauser.user_id,
                            tasklist: taskdata[0]
                        }
                        console.log(objtask);
                        userTasklist.push(objtask);
                    }
                
            })
            console.log(userTasklist)
            //res.send({ message: "user list fetched", userdata: userdata[0], tasklistdata: userTasklist })
        }   
}
 

Комментарии:

1. userdata[0].map((datauser) => { не является асинхронным, и вы используете await db.query(.... его внутри.

2. @Райан Уилсон…… Итак, как я добавлю асинхронность в userdata[0].map((datauser) => { Я новичок в узле. Пожалуйста, Предложите

3. Теперь я использую это….. данные пользователя[0].карта(асинхронный (datauser) => { Все еще console.log(userTasklist) этот массив пуст

Ответ №1:

Область ожидания запроса db.находится в пределах функции map. Функция map должна иметь ключевое слово async. Однако это все равно не сработает, если вы не завернете это в Обещание.все. Это позволит убедиться, что все итерации карты разрешены, прежде чем двигаться дальше в вашем коде.

 exports.allUserList = async (req, res) => {
  const db = await connection()
  let userID = req.params.userid

  const userdata = await db.query('SELECT name, user_id, employee_code FROM users WHERE under_gh = ?', [userID])
  // console.log(userdata[0])

  if (userdata[0] amp;amp; userdata[0].length > 0) {
    let userTasklist = []
    await Promise.all(
      userdata[0].map(async (datauser) => {
        var objtask = {}
        const taskdata = await db.query("SELECT DATE_FORMAT(created_date, '%Y-%m-%d') as created_date, created_time, tasklist, user_id, DATE_FORMAT(created_by, '%Y-%m-%d') as date, DATE_FORMAT(created_by, '%H:%i:%s') as time FROM tasklist where user_id = ?", [datauser.user_id])

        if (taskdata[0] amp;amp; taskdata[0].length > 0) {
          objtask = {
            userid: datauser.user_id,
            tasklist: taskdata[0]
          }
          console.log(objtask)
          userTasklist.push(objtask)
        }
      })
    )

    console.log(userTasklist)
    // res.send({ message: "user list fetched", userdata: userdata[0], tasklistdata: userTasklist })
  }
}
 

Ответ №2:

Вам следует изменить userdata[0].map((datauser) => { на userdata[0].map(async (datauser) => {

Комментарии:

1. Теперь я использую это….. данные пользователя[0].карта(асинхронный (datauser) => { Все еще console.log(userTasklist) этот массив пуст