Сохранение ответа json в течение n минут

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

Получение ответа от api занимает около 1,5 с, поэтому я подумал, что мог бы просто сохранять ответ каждые n минут, а затем вместо вызова внутренней команды api я бы просто возвращал сохраненный ответ. Итак, мой вопрос в том, каков наилучший способ сделать это? Поскольку ответ api очень длинный, я не думаю, что его стоит сохранять в db. Или, может быть, при каждом вызове команды просто вызывайте api, а затем сохраняйте его где-нибудь в течение n минут, и если команда была вызвана снова в течение этого n периода времени, просто получайте сохраненный ответ вместо того, чтобы каждый раз вызывать api.

Я просто не уверен, как и где сохранить ответ.

 const fetch = require('node-fetch');
let data = await fetch('apiurl').then(body => body.json());
  

Комментарии:

1. Не могли бы вы, пожалуйста, добавить свой код?

2. добро пожаловать в SO. Попробуйте реализовать кэширование на стороне сервера, это должно помочь: npmjs.com/package/node-cache В будущем, пожалуйста, не забудьте опубликовать то, что вы пробовали с примерами кода, поскольку этот вопрос довольно широкий по объему.

3. У меня нет никакого конкретного кода, поскольку я понятия не имею, с чего начать, у меня просто есть базовый вызов api и все

4. @Bibberty Я начал использовать node-cache (спасибо Стивену Старку), еще один вопрос, является ли хорошей практикой вызывать api каждые 1-5 минут?

5. @StevenStark есть ли какие-нибудь плюсы в использовании node-cache сравнения с ответом от Bibberty?

Ответ №1:

В этом примере (очень простом, который я знаю) у нас есть кэш памяти, который обновляется, если он старше 5 секунд.

 const dummyGetLiveData = () => {
  return { "data": "value" }
};

let cache;
let maxCacheAgeInMilliseconds = 5000; // 5secs

const provideData = () => {
  if(!cache || (Date.now() - cache.timeStamp > maxCacheAgeInMilliseconds) ) {
    console.log('Cache Build');
    cache = {
      timeStamp: Date.now(),
      data: dummyGetLiveData()
    }
  }
  return cache.data;  
};

document.querySelector('button').addEventListener('click', () => {
  console.log(provideData());
});  
 <button>Get Data</button>