Как синхронизировать изменения базы данных mongoDB в Redis с помощью node.js - PullRequest
0 голосов
/ 28 сентября 2019

Описание проблемы приведено ниже: сначала я создал несколько сообщений, используя свой бэкэнд-API, затем во время извлечения сообщений сначала смотрю на Redis, если существует ключ, связанный с этими сообщениями, затем я возвращаю данные ещеЯ отправляю запрос в MongoDB и получаю все эти сообщения, а затем сохраняю его в Redis.Теперь снова делаю запрос на выборку данных, а затем корректно получаю данные из Redis.Но проблема в том, что когда я теперь добавляю другой пост, используя POST-запрос из моего бэкэнда, а затем снова обновляю свой redis, он успешно создается в mongoDB, но когда я делаю посты, я получаю более старые кэшированные посты вместо всех постов, включая новые посты.

router.get('/posts',(req, res)=>{
  // check if any hashed data is there in redis 
  client.get('posts',(err, posts)=>{
    if(posts){
      // if yes then send it right away
      console.log('serving from redis ');
      return res.json({success: true, posts: JSON.parse(posts)});
    } else {
      //  if no then send the request and updated the redis with the new data 
      console.log('serving from mongoDB');
      Post.find({})
        .sort('-date')
        .populate('user', ['name', 'avatar', 'email'])
        .populate('profile')
        .exec((err, posts)=>{
          if(err){
            console.log(err);
            res.status(404).json({success: false, err});
          } 
          if(posts){
            // now update the redis cache       
            client.set('posts', JSON.stringify(posts));
            res.json({success: true, posts: posts});
          }
        })
      }
    });
});

Вот код для создания постов и обновления redis: -


router.post('/create',passport.authenticate('jwt',{session: false}),(req, res)=>{
  // check if profile for the user exists or not 
  Profile.findOne({user: req.user.id})
    .then((proifle)=>{
      console.log(proifle);
      if(!profile){
        return res.json({success: false, msg: 'Please create the profile first'});
      } else {
        // create post 
        const newPost = new Post({
          profile: profile._id,
          user: req.user.id,
          title: req.body.title,
          description: req.body.description,
          requiredFunding: req.body.requiredFunding,
          date: Date.now()
        })
        newPost.save()
          .then((post)=>{
            console.log(post);
            // set post in the redis 
            client.set(JSON.stringify(post._id), JSON.stringify(post));
            res.json({success: true, post});
          })
          .catch((err)=>{
            console.log(err);
          })
      }
    })
    .catch((err)=>{
      console.log(err);
      res.status(404).json({success: false, err});
    })
});
...