Node Js await не работает внутри асинхронной функции

Я пытаюсь получить некоторые данные из базы данных с помощью async/await, затем создаю объект с некоторыми данными и вставляю их в базу данных. Мне нужно, чтобы вызовы были синхронными для этого, чтобы отправлять полные данные для вставки. У меня есть асинхронная функция, но ожидание не работает...

Код ниже:

async function queryDb(roleName) {
    let pool = await sql.connect(dbConfig);
    let data = await pool.request()
        .query(`select id from table where name='${roleName}'`);
    roleId = data.recordset[0].id;
    pool.close;
    sql.close;
    return roleId;
}

queryDb(roleId)
    .then(result => {
        console.info(result);
    })
    .catch(err => {
        pool.close;
        sql.close;
        console.info(err)
    })

async function program() {
    const xlsxFile = require('read-excel-file/node');
    xlsxFile('./file.xlsx').then((rows) => {
        let roleid = await queryDb(rows[0][1]); // here is not working
        let insretObj = {
            field1: rows[0][0],
            field2: rows[1][1],
            field3: rows[2][2],
            field4: rows[3][3],
            field5: rows[4][4],
            field6: rows[5][5],
            role_id: roleid,
        };
        assignRoles(insretObj);
    });

};

program().then(console.info('hereeeeeee'));

Я очень ценю ваш ответ.

Какую библиотеку вы используете для доступа к sql? Поддерживает ли он обещания?

jfriend00 11.12.2020 20:34

Кроме того, в чем смысл pool.close и sql.close? Это должны быть вызовы функций, которые вы на самом деле вызываете, как в pool.close() и sql.close()?

jfriend00 11.12.2020 20:35

@ jfriend00 Я использую mssql. а что касается другого, да, я полагаю, они одинаковы.

Nda.S 11.12.2020 20:37

Они не одинаковы. Утверждение вроде pool.close ничего не делает.

jfriend00 11.12.2020 20:38

@ jfriend00 это связано с моей проблемой? ожидание не работает внутри функции программы

Nda.S 11.12.2020 20:41

Нет, это, вероятно, не связано с этой проблемой, но позже это вызовет другую проблему.

jfriend00 11.12.2020 20:45

Где в вашем комментарии написано "здесь не работает", что именно означает "не работает"? Что именно вы наблюдаете? Что именно вы ожидаете или хотите, чтобы поведение было другим?

jfriend00 11.12.2020 20:46

@ jfriend00 показывает эту ошибку «ожидание допустимо только в асинхронной функции». Я за исключением того, чтобы получить здесь roleId и создать объект ниже с этим идентификатором роли.

Nda.S 11.12.2020 20:53
.then(async (rows) => {.. не забывайте использовать try/catch при использовании async/await
Lawrence Cherone 11.12.2020 21:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
411
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

он показывает эту ошибку «ожидание допустимо только в асинхронной функции». Я за исключением того, чтобы получить здесь roleId и создать объект ниже с этим идентификатором роли.

Вы используете await внутри вложенного обратного вызова обработчика .then(), который сам по себе не является async.

В общем, вы не хотите смешивать .then() и await в одном и том же потоке управления. Я бы посоветовал вам изменить его на это:

const xlsxFile = require('read-excel-file/node');

async function program() {
    let rows = await xlsxFile('./file.xlsx');
    let roleid = await queryDb(rows[0][1]);
    let insretObj = {
        field1: rows[0][0],
        field2: rows[1][1],
        field3: rows[2][2],
        field4: rows[3][3],
        field5: rows[4][4],
        field6: rows[5][5],
        role_id: roleid,
    };

    assignRoles(insretObj);
}

Другие вопросы по теме