从Redis中删除key后,Node无限期挂起

kq0g1dla  于 2023-11-16  发布在  Redis
关注(0)|答案(1)|浏览(145)

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

我感谢任何见解或建议,以帮助解决这个问题。谢谢!

ssm49v7z

ssm49v7z1#

当我在这里查看redisClient文档时,我看到了已经返回promise的方法(不接受回调)。因此,你不能用util.promisify()“promisify”它们。
因此,当你尝试promisify一个已经返回promise并且不接受回调的方法时,promisify函数传递给它的回调永远不会被调用,promisify创建的promise永远不会被解析,你正在等待的promise永远不会被解析或拒绝,你的代码永远不会前进。
所以,除非你使用的是一个很老的redisClient,你可以这样做:

router.delete('/logout', async (req, res, next) => {
    try {
      ...
   
      const response = await redisClient.DEL(userId);
  
        
      if (response === 1) {
        console.log("Deleted Successfully!");
        res.status(204).send();
      } else {
        console.log("Cannot delete");
        throw createError.InternalServerError();
      }
    } catch (error) {
      next(error);
    }
  });

字符串
根据this post,Node Redis 4.x在一个突破性的变化中将其方法从回调改为承诺(不再支持回调)。

相关问题