Функция запроса к базе данных не работает асинхронно - PullRequest
0 голосов
/ 23 февраля 2020

Итак, я создал функцию на моем сервере узлов, которая принимает строку запроса, запускает ее на моей базе данных и возвращает результаты. Затем я захотел использовать мою функцию асинхронно, используя asyn c await на всех моих маршрутах, вместо того, чтобы иметь вложенный запрос во вложенном запросе внутри вложенного запроса и т. Д. c.

Так вот код:

 const runQuery = queryString => {
    console.log("...runQuery")
    db.query(queryString, (error, results, fields) => {
        if (error) {
            console.log("runQeury: FAILURE");
            return error;
        }
        else {
            console.log("runQeury: SUCCESS");
            return(results);
        }
    })
}

register.post("/", async (req, res) => {
    console.log(req.body);
    const results = await runQuery("select * from test1");
    res.send(results);
})

В базе данных должно быть 3 записи, но, к сожалению, она ничего не возвращает. Значение «результатов» - пустая переменная при отправке, что означает, что JS никогда не ожидает, пока она не получит результаты БД. Как я могу использовать свою функцию асинхронно и как это возможно?

1 Ответ

1 голос
/ 23 февраля 2020

Кажется, ваша функция "runQuery" не возвращает обещание, фактически она ничего не возвращает. Вы используете "return" в обратном вызове функции db.query, а не самой функции "runQuery".

Поскольку runQuery выполняет асинхронную операцию, результат должен быть разрешен с помощью обещания (которое является что ищет «await» в вашем обработчике запросов).

Я не совсем уверен, но, похоже, вы используете MySql, и я не смог найти ничего на странице npm mysql пакет, касающийся обещанного запроса, поэтому мы сами обещаем его:

const runQuery = (queryString) => new Promise((resolve,reject) => {
    console.log("...runQuery")
    db.query(queryString, (error, results, fields) => {
        if (error) {
            console.error("runQuery: FAILURE");
            reject(error);
        } else {
            console.log("runQeury: SUCCESS");
            resolve(results);
        }
    })

})

register.post("/", async (req, res) => {
    console.log(req.body);
    try{
        const results = await runQuery("select * from test1");
        res.send(results);
    }catch(e){
        console.error(`ERROR THROWN BY runQuery:`,e);
        res.status(500).send({
            message: e.message || "INTERNAL SERVER ERROR"
        })
    }
})

Обратите внимание, что в случае возникновения ошибки наша обещанная функция отклонит ошибку и НЕ будет сохранена в " Результаты »в нашем обработчике запросов. Вместо этого будет выдана ошибка, которую необходимо обработать. Следовательно, всегда хорошая практика - помещать любые асинхронные / ожидающие вызовы внутри try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...