Redis节点如何在异步/等待功能中返回True

时间:2018-07-06 02:53:15

标签: javascript node.js async-await node-redis

请原谅我这个问题。 我不习惯结点和同步/等待

我具有以下函数,该函数查询返回json的mongodb,我保存了redis上的返回。 到目前为止一切顺利。

findLightnings: async (request, h) => {
    const q = request.query.q.split(':');
    const index = q[0];
    const value = q[1].split(',');

    const dateInit = new Date(request.query.dateInit);
    const dateEnd = new Date(request.query.dateEnd);
    const page = request.query.page;
    const distance = request.query.distance;
    const redis = require('redis');
    const client = redis.createClient();

    let limit = 300;

    let filter = {
      $and: [{
        data: {
          $gte: dateInit.toISOString(),
          $lte: dateEnd.toISOString()
        }
      }]
    }

    if (index === 'latlng') {
      filter['$and'][0]['geo.coordinates'] = {
        $near: {
          $geometry: {
            type: 'Point',
            coordinates: value.map(Number),
            $minDistance: 0,
            $maxDistance: distance
          }
        }
      }
      limit = 100;
    } else {
      filter['$and'][0][`cidade.${index}`] = {
        $in: value
      }
    }

    return client.get('elektro', async (err, reply) => {
    let resp = null;

    if (reply) {
        console.log(reply); //<<<<<<<< Return Json OK
        resp = reply // <<<<<<<<<< Return TRUE in json's place
    } else {
        console.log('db')
        const query = await Lightning.find(filter).sort('data').skip(page*limit).limit(limit).exec();
        client.set('elektro', JSON.stringify(query));
        client.expire('elektro', 3600);
        resp = query
    }

    return JSON.stringify(resp);
  })
  }

问题在于是时候从Redis恢复此数据了。 在控制台日志中,json看起来很正常,有多少tento返回它为“ TRUE”的主要功能的值,而不是保存在redis中的json。

有人可以帮我这个忙。 我真的需要这个功能。

2 个答案:

答案 0 :(得分:0)

我能够使用redis client.getAsync()解决问题。

已经具有本地异步功能: 来源:https://github.com/NodeRedis/node_redis

最终代码如下:

 findLightnings: async (request, h) => {
     const q = request.query.q.split(':');
     const index = q[0];
     const value = q[1].split(',');

     const dateInit = new Date(request.query.dateInit);
     const dateEnd = new Date(request.query.dateEnd);
     const page = request.query.page;
     const distance = request.query.distance;

     let limit = 300;

     let filter = {
       $and: [{
         data: {
           $gte: dateInit.toISOString(),
           $lte: dateEnd.toISOString()
         }
       }]
     }

     if (index === 'latlng') {
       filter['$and'][0]['geo.coordinates'] = {
         $near: {
           $geometry: {
             type: 'Point',
             coordinates: value.map(Number),
             $minDistance: 0,
             $maxDistance: distance
           }
         }
       }
       limit = 100;
     } else {
       filter['$and'][0][`cidade.${index}`] = {
         $in: value
       }
     }

    return getAsync('findLightnings'+ '/' + request.query.q + '/' + request.query.dateInit + '/' + request.query.dateEnd).then(async (res) => {
        if(res){
          console.log('Fonte Dados => redis')
          return res
        }else{
          console.log('Fonte Dados => db')
           try {
             const query = await Lightning.find(filter).sort('data').exec();//.skip(page*limit).limit(limit).exec();
             client.set('findLightnings'+ '/' + request.query.q + '/' + request.query.dateInit + '/' + request.query.dateEnd, JSON.stringify(query));
             return query;
           } catch (err) {
             return Boom.badData(err);
           }
        }
        client.close();
      });
   },

答案 1 :(得分:0)

const redis = require('redis');

const client = redis.createClient(6379);

const bluebird = require("bluebird");

bluebird.promisifyAll(redis.RedisClient.prototype);

bluebird.promisifyAll(redis.Multi.prototype);

const redisdata = await client.getAsync("user:photos");

if (redisdata) {

        console.log(`cache EXISTS`)

        return res.json({ source: 'cache', data: JSON.parse(redisdata) })

    } 
相关问题