NodeJS приложение не ожидает ответа от базы данных MySQL - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь настроить приложение NodeJS с API GraphiQL и подключением к базе данных MySQL. Кажется, все это работает, пока я не пытаюсь получить данные, извлеченные из базы данных, для GraphQL, чтобы иметь возможность что-то с ним делать.

Здесь у нас есть приложение. js файл , которая является отправной точкой бэкэнда. Предположим, что все импорта и объявления действительны.

app.use('/api', graphql({
    schema: buildSchema(schema),
    rootValue: resolvers,
    graphiql: true
}));

Значение rootValue выглядит следующим образом.

const resolvers = {
    regions: () => {
        var a = manager.getRegions();
        console.log("a: " + a);
        return a;
    }
};

Объект менеджера. У меня есть объект менеджера, если я хочу изменить тип базы данных в будущем.

const manager = {
    getRegions : function() {
        console.log("getRegions entered...");
        return processQuery("regions");
    }
};

Наконец, по сценарию MySQL мы имеем.

const processQuery = (query) => {
    var res = null;
    switch (query) {
        case 'regions':
        default:
            db.query(SELECT_REGIONS_QUERY, (err, rows) => {
                if (err) {
                    throw err;
                } else {
                    res = JSON.stringify(rows);
                    console.log("Stringify: " + res);
                }
            });
    }
    return res;
}

Я прочитал множество на страницах и даже сообщениях о стеке потока о Promise, функциях обратного вызова и async / await, но ни один (по крайней мере, из-за предпринятых мною попыток кода), кажется, не делает распечатку в rootValue распечатанной последней ...

Я видел, что реализация выполнена Academind, который использует MongoDB вместо этого, и ему, кажется, не нужно заботиться об этой проблеме. Есть идеи, как это решить? Спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Что вы можете сделать, это сделать processQuery асинхронной функцией и просто подождать, пока db.query будет решен.

const processQuery = async (query) => {
    var res = null;
    switch (query) {
        case 'regions':
        default:
            await db.query(SELECT_REGIONS_QUERY, (err, rows) => {
                if (err) {
                    throw err;
                } else {
                    res = JSON.stringify(rows);
                    console.log("Stringify: " + res);
                }
            });
    }
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...