Сохранять кеш, даже если процесс Node умирает - PullRequest
0 голосов
/ 06 сентября 2018

Мой бэкэнд, Nodejs, должен выполнить несколько запросов API GET к внешним службам для извлечения данных и использования в качестве веб-страницы. Эти вызовы API кэшируются. Поскольку я использую Heroku, эти данные удаляются каждый раз, когда приложения переходят в режим гибернации. Есть ли какая-нибудь библиотека кешей, которая сохраняется? В настоящее время я использую lru-cache и axios-extensions.

const axios = require('axios');
const { cacheAdapterEnhancer } = require('axios-extensions');
const LRUCache = require("lru-cache")

const options = {
    defaultCache: new LRUCache({ maxAge: 60 * 60 * 1000, max: 100 })
}

const http = axios.create({
        headers: { 'Cache-Control': 'no-cache' },
        timeout: 60000,
        adapter: cacheAdapterEnhancer(axios.defaults.adapter)
    }
)

getData: async () => {
    try {
        const response = await http.get(url, config)
        const data = response.data
        return data
    } catch (error) {
        console.log(error)
    }
}

1 Ответ

0 голосов
/ 07 сентября 2018

Как подсказывает @giankotarola в комментариях, мне нужно было использовать кеш-базу данных для решения проблемы. Наконец мне удалось заставить его работать с помощью Redis! Мой окончательный код:

const axios = require('axios')
const redis = require('redis')

// create and connect redis client to local instance.
const client = redis.createClient()

// Print redis errors to the console
client.on('error', (err) => {
    console.log("Error " + err)
});

const http = axios.create({
    headers: { 'Cache-Control': 'no-cache' },
    timeout: 60000
}
)

let config = {
    headers: {
        Authorization: `Bearer ${API_KEY}`,
    }
}

let url = 'https://example.com'

module.exports={
    getData: async () => {
        try {
            // Try to get response from Redis store
            const response = await client.get(url)
            return responseJSON = JSON.parse(response)
        } catch (err) {
            try {
                const response = await http.get(url, config)
                const data = response.data

                // Save response in Redis store
                client.setex(url, 60 * 60 * 1000, JSON.stringify(data));
                return data
            } catch (error) {
                console.log(error)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...