Redis, как узел возвращает True в функции async / await - PullRequest
0 голосов
/ 06 июля 2018

прости меня вопрос. Я не привык нодировать и синхронизировать / ждать

У меня есть следующая функция, которая запрашивает у mongodb, возвращающего json, я сохраняю этот возврат на 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, а не json, сохраненное в redis.

Кто-то может помочь мне в этом. Мне действительно нужна эта функция.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019
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) })

    } 
0 голосов
/ 10 июля 2018

Мне удалось решить проблему с помощью 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();
      });
   },
...