首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS Redis (ioredis)高抛错误

NodeJS Redis (ioredis)高抛错误
EN

Stack Overflow用户
提问于 2021-08-20 20:38:30
回答 1查看 799关注 0票数 0

我正在构建一个使用ioredis模块连接到Redis集群的NodeJS应用程序。

这一问题概述:

  • 对缓存中不存在的键的查找查询会像预期的
  • 一样返回一个空对象。对确实存在缓存的键的查找查询将引发错误,但错误未定义。

我创建了一个控制器来创建和管理连接:

代码语言:javascript
复制
const redis = require('ioredis');
const consoleLogger = require('../logger/logger.js').console;

const redisCtrl = {};

redisCtrl.defaultPrefix = 'lookup:';

// Local variable to store the full time connection to Redis for lookups
let _redisClient;

// Redis connection config
redisCtrl.redisConnect = {
  port: process.env.REDIS_PORT || 6379,
  host: process.env.REDIS_HOST,
  password: process.env.REDIS_PASSWORD
};

// Redis config
redisCtrl.redisConfig = {
  dnsLookup: (address, callback) => callback(null, address),
  redisOptions: {
    tls: process.env.REDIS_SSL === 'false' ? false : true,
    password: process.env.REDIS_PASSWORD,
    maxRetriesPerRequest: 1
  }
};

// Retrieve the redis connection
redisCtrl.redisClient = async () => {
  if (!_redisClient) {
    _redisClient = await redisCtrl.getNewConnect();
  }
  return _redisClient;
}

redisCtrl.getNewConnect = async () => {
  let makeConnection;

  if (process.env.REDIS_CLUSTER === 'true') {
    makeConnection = new redis.Cluster([redisCtrl.redisConnect], redisCtrl.redisConfig);
  } else {
    makeConnection = new redis(redisCtrl.redisConnect);
  }

  makeConnection.on("connect", function (err) {
    if (!err) {
      consoleLogger.info("REDIS connected");
    } else {
      consoleLogger.info("REDIS connection error");
      consoleLogger.error(JSON.stringify(err));
    }
  });

  makeConnection.on("error", function (error) {
    consoleLogger.info("REDIS error");
    consoleLogger.error(JSON.stringify(error));
    throw new Error(error);
  });

  return makeConnection;
}

redisCtrl.closeInstance = (cb) => {
  if (_redisClient) {
    _redisClient.quit(cb);
  }
}

module.exports = redisCtrl;

这可以用来建立连接。

但是,当试图获得结果时,会从hgetall方法抛出一个空错误。

代码语言:javascript
复制
/**
 * Lookup asset by assetId in Redis cache
 * Return asset data object
 * @param {str} assetId
 */
assetsCtrl.lookupByAssetId = async (assetId) => {
  // Prepend default cache prefix to lookup value
  const lookupKey = `${redisPrefix || `lookup:`}${assetId}`;
  let cachedAsset;
  try {
    cachedAsset = await assetsCtrl.redisClient.hgetall(lookupKey);
  } catch (e) {
    consoleLogger.error(`Lookup by assetId failed. Lookup key: ${lookupKey}`);
    consoleLogger.error(e);
    throw new Error(e);
  }
  return cachedAsset;
}

抛出错误,但错误未定义。正在调用redisClient.hgetall(lookupKey)行的"catch“块,但没有定义错误。

代码语言:javascript
复制
error: Lookup by assetId failed. Lookup key: lookup:test123456789
**error: undefined {"command":{"name":"hget","args":["lookup:test123456789"]}}**

问题:如何解决此问题?如何查看正在抛出的错误的详细信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 17:14:52

如上文评论所述,

由于与值对应的数据类型不是hash,所以hgetall()无法工作。

将其更改为get()解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68867834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档