axios 在使用和提供API的应用程序中缓存

tmb3ates  于 2022-11-23  发布在  iOS
关注(0)|答案(1)|浏览(170)

我不知道这是不是最好的地方问,但是。
我正在构建一个天气应用程序,它使用axios使用api,然后使用express提供服务。我想知道我应该在哪里添加缓存来提高api的速度?当我使用时是在axios层还是在express层。
下面是我的代码,用于一点上下文

import { weatherApiKey } from 'config';
import axios from 'axios';

const forecast = (location, service) => {
    console.log('inside api calling location: ', location);
    axios.get(`http://api.openweathermap.org/data/2.5/weather?q=${location}&appid=${weatherApiKey}`)
        .then(res => {
            service(undefined, res.data)
        })
        .catch(err => {
            service('Error calling weather API');
        })
}

module.exports = forecast;

然后,我将通过以下方式为使用的api提供服务。

app.get('/weather', (req, res) => {
    const locale = req.query.locale;

    if(!locale) {
        return res.send({
            error: 'Please provide valid locale'
        })
    }

    foreCast(locale, (err, weatherData) => {
        if(err) {
            console.log('error in calling weather API')
            res.send({err});
        }
        console.log('returning weather data', weatherData)
        res.send({weatherData})
    });
    
})
tp5buhyn

tp5buhyn1#

是的,通常有很多表单和层需要缓存。考虑到你正在创建一个API,我希望一些缓存尽可能地应用到消费者。这可能是在CDN级别。但是,一个快速简单的答案是为你的Express应用添加一些东西作为可缓存的中间件。
有很多方法可以填充和失效缓存,您需要注意针对您的用例进行规划。尽量不要过早地优化缓存。它会带来复杂性和依赖性,并且在应用大量缓存层时会导致难以调试的问题。
但一个简单的例子是这样的:

'use strict'

var express = require('express');
var app = express();
var mcache = require('memory-cache');

app.set('view engine', 'jade');

var cache = (duration) => {
  return (req, res, next) => {
    let key = '__express__' + req.originalUrl || req.url
    let cachedBody = mcache.get(key)
    if (cachedBody) {
      res.send(cachedBody)
      return
    } else {
      res.sendResponse = res.send
      res.send = (body) => {
        mcache.put(key, body, duration * 1000);
        res.sendResponse(body)
      }
      next()
    }
  }
}

app.get('/', cache(10), (req, res) => {
  setTimeout(() => {
    res.render('index', { title: 'Hey', message: 'Hello there', date: new Date()})
  }, 5000) //setTimeout was used to simulate a slow processing request
})

app.get('/user/:id', cache(10), (req, res) => {
  setTimeout(() => {
    if (req.params.id == 1) {
      res.json({ id: 1, name: "John"})
    } else if (req.params.id == 2) {
      res.json({ id: 2, name: "Bob"})
    } else if (req.params.id == 3) {
      res.json({ id: 3, name: "Stuart"})
    }
  }, 3000) //setTimeout was used to simulate a slow processing request
})

app.use((req, res) => {
  res.status(404).send('') //not found
})

app.listen(process.env.PORT, function () {
  console.log(`Example app listening on port ${process.env.PORT}!`)
})

注意:这是使用memory-cache npm套件从https://medium.com/the-node-js-collection/simple-server-side-cache-for-express-js-with-node-js-45ff296ca0f0取得的。

相关问题