как заново установить кеш и правильно использовать в nodejs? - PullRequest
0 голосов
/ 01 мая 2019

Я пытался использовать crud для node.js, используя mongodb, и также сохранял его в кеше redis. Первый раз я попытался запустить метод get для получения данных из БД, а второй раз я запустил метод get. Он получил данные из кэша, но я попытался удалить данные в таблице, и в другой раз, чтобы запустить метод get, он не показывает данные. Он показывает пустые данные. Но данные хранятся в кэше Redis. как я могу решить эту проблему?

cache.js

// var asyncRedis = require("async-redis")

// var myCache = asyncRedis.createClient()
var redis = require('redis');

const client = redis.createClient()

client.on('connect', function () {
    console.log('Redis client connected');
});

client.on('error', function (err) {
    console.log('Something went wrong ' + err);
});



var value;
var todayEnd = new Date().setHours(23, 59, 59, 999);







function  Get_Value()
{
    client.get('products', function(err,results) {
        value = JSON.parse(results);

    })
    return value
}

function Set_Value(products)
{
    client.set('products', JSON.stringify(products))
    client.expireat('products', parseInt(todayEnd/1000));


}

exports.get_value = Get_Value;

exports.set_value = Set_Value;

routes.py

data = cache.get_value()
      console.log(data)
      if (data) {
        console.log("GET")
        res.send(data)
      }
      else {
        console.log("SET")
        const r = await db.collection('Ecommerce').find().toArray();
        res.send(r)
        data = cache.set_value(r)
      }

1 Ответ

0 голосов
/ 01 мая 2019

хари,

Твой Get_Value выглядит немного странно для меня. Redis get будет выполняться асинхронно. Поэтому, когда вы помещаете оператор return value вне функции обратного вызова, он сразу же возвращается, value по-прежнему не определен.

Самый простой способ решить эту проблему - вызвать Get_Value с обратным вызовом для продолжения, когда redis GET вернется.

function  Get_Value(callback) {
    client.get('products', function(err,results) {
        let value = JSON.parse(results);
>>      callback(value);
    });
}

Вы бы использовали это так:

Get_Value(function(value) {
    console.log("products: " + value);
}

Другой вариант - использовать Promise API от Node Redis (см. Документы здесь: https://github.com/NodeRedis/node_redis)

Помогает ли это?

...