javascript - redis hmget node.js async/await 不工作
问题描述
我正在尝试使用以下代码通过 node.js 从 redis 获取一些数据:
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.
我错过了什么/做错了什么?我已经阅读了很多建议相同的教程/文章。
解决方案
异步函数只不过是返回 Promise 的函数的语法糖,只有在函数中使用时才使函数异步才有意义await
。
您的功能isAdminUser
不使用await
,因此不需要async
. 它实际上并没有在那里做任何事情。
此外,您正在传递您的redis_client
to 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;
}
推荐阅读
- python - 如何从列表中的 for 循环中获取值?
- amazon-redshift - Redshift 系统表只返回当前数据库的结果。如何进行跨数据库查询?
- rdlc - Reportviewer 在 IIS 上给出 Uncaught Sys.WebForms.PageRequestManagerServerErrorException
- javascript - Babylonjs -- 如何以编程方式获取 Inspector 信息?
- google-chrome - 具有后台功能的网络蓝牙?
- php - 为什么 aws-sdk-php 3 除了一般异常之外,还删除了 DynamoDb 异常?
- matlab - 通过一些 3D 点拟合一条线
- php - WooCommerce 从订单中获取状态已付款或免费跟踪
- weighted-average - If else 和 if 加权平均
- javascript - 自动清除多个输入字段