Problem我在Node.js应用程序中遇到了一个问题,我成功地从Redis中删除了一个密钥,但应用程序无限期挂起,并且没有按照预期进行。我已经验证了密钥确实从Redis中删除了,但程序没有退出或继续下一步。
init_redis.js
const redis = require('redis');
const redisClient = redis.createClient({
password: process.env.REDIS_PASSWORD,
socket: {
host: process.env.REDIS_HOSTNAME,
port: process.env.REDIS_PORT,
}
});
(async () => {
await redisClient.connect();
})();
...
const delAsync = util.promisify(redisClient.DEL).bind(redisClient);
module.exports = { redisClient, delAsync };
字符串
route.js
router.delete('/logout', async (req, res, next) => {
try {
...
const response = await delAsync(userId);
if (response === 1) {
console.log("Deleted Successfully!");
res.status(204).send();
} else {
console.log("Cannot delete");
throw createError.InternalServerError();
}
} catch (error) {
next(error);
}
});
型
观察结果我已经确认密钥从Redis中删除了。但是,应用程序在删除后似乎没有向前移动。我已经使用了aplogc/await并检查了代码中的错误。
What I've Trying使用callc/await检查错误。验证Redis连接是否稳定。确保代码的其他部分不会导致延迟。
问题在Redis中成功删除key后,什么原因会导致应用挂起?Node.js中是否有特定的最佳实践来处理Redis的异步操作?如何排除故障并确定应用挂起的根本原因?
附加上下文Node.js版本:16.15.1 Redis版本:4.6.10撞table:6x
我感谢任何见解或建议,以帮助解决这个问题。谢谢!
1条答案
按热度按时间ssm49v7z1#
当我在这里查看redisClient文档时,我看到了已经返回promise的方法(不接受回调)。因此,你不能用
util.promisify()
“promisify”它们。因此,当你尝试promisify一个已经返回promise并且不接受回调的方法时,promisify函数传递给它的回调永远不会被调用,promisify创建的promise永远不会被解析,你正在等待的promise永远不会被解析或拒绝,你的代码永远不会前进。
所以,除非你使用的是一个很老的redisClient,你可以这样做:
字符串
根据this post,Node Redis 4.x在一个突破性的变化中将其方法从回调改为承诺(不再支持回调)。