redis hmget node.js async / await не работает - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь получить некоторые данные из redis через node.js, используя следующий код:

var moment = require("moment");
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var crypto = require('crypto');
var redis = require('redis');
var bluebird = require("bluebird");
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);


const uuidv4 = require('uuid/v4');

var KEY_USERS = "auction:users";
var KEY_ADMIN_TOKENS = KEY_USERS + ":admin_tokens";
var KEY_USER_TOKENS = KEY_USERS + ":user_tokens";
var SERVER_PORT = 12251;

var redis_client = bluebird.promisifyAll(redis.createClient({
        host: '127.0.0.1',
        no_ready_check: true,
        auth_pass: '****',
}));



redis_client.on('connect', function () {
        console.log('Redis client connected');
});

redis_client.on('error', function (err) {
        console.log('Something went wrong with Redis Connection ' + err);
});

server.listen(SERVER_PORT);

console.log('1');

(async () => {

        var response = await isAdminUser('c169024a-8902-4310-8955-ff46516e8703');

        console.log("From Async " + response);        
})()

console.log('2');

// Promise.resolve()
//         .then(() => isAdminUser('c169024a-8902-4310-8955-ff46516e8703'))
//         .then(() => console.log('3'));


console.log("Server Connected and redis initialized.");

async function isAdminUser(token) {
        return new Promise((resolve, reject) => {

                redis_client.hmget(KEY_ADMIN_TOKENS, [token, token], function (error, result) {
                        if (error) {
                                console.log(error);
                                throw error;
                        }
                        console.log("Token Result : " + result);

                        resolve(result);
                });
        });
}

Теперь проблема в том, что узел ожидает завершения запроса redis и переходит к следующей строкекода.

Вывод из консоли:

1
2
Server Connected and redis initialized.
Redis client connected
Token Result : "my result"
From Async "my result"

Желаемый вывод:

1
2
Redis client connected    
Token Result : "my result"
From Async "my result"
Server Connected and redis initialized.

Что я пропускаю / делаю неправильно?Я прошел много уроков / статей, предлагающих то же самое.

1 Ответ

0 голосов
/ 22 июня 2019

Асинхронные функции являются не более чем синтаксическим сахаром для функций, которые возвращают обещания, и имеет смысл сделать функцию асинхронной, если вы используете await в функции.

Ваша функция isAdminUserне использует await, поэтому ему не нужно async.Это на самом деле ничего не делает.

Кроме того, вы передаете свой redis_client на promisifyAll, но для того, чтобы это имело какой-либо эффект, вам нужно использовать методы async в клиенте.

Я немного переработал ваш код, чтобы перевести инициализацию клиента в обещание:

const initializeRedisClient = () => new Promise((resolve, reject) => {
    const redis_client = bluebird.promisifyAll(redis.createClient({
        host: '127.0.0.1',
        no_ready_check: true,
        auth_pass: '****',
    }));

    redis_client.on('connect', function () {
        console.log('Redis client connected');
        resolve(redis_client);
    });

    redis_client.on('error', function (err) {
        console.log('Something went wrong with Redis Connection ' + err);
        reject(err);
    });
});

(async () => {
    const redis_client = await initializeRedisClient();
    const response = await isAdminUser(redis_client, 'c169024a-8902-4310-8955-ff46516e8703');

    console.log("From Async " + response);
    console.log("Server Connected and redis initialized.");
})()

console.log('2');

async function isAdminUser(redis_client, token) {
    const result = redis_client.hmgetAsync(KEY_ADMIN_TOKENS, [token, token]);

    console.log("Token Result : " + result);

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