#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) этот массив пуст