在expressJS中如何创建一个缓存,使多个请求等待相同的promise [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在expressJS中如何创建一个缓存,使多个请求等待相同的promise [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我有快递端点。

app.get('/',(req,res)=>{

   Promise.all(fetch(url1),fetch(url2))
      .then(i=>res.send(i=))
})

我想制作一个缓存,以避免每隔15秒发出一次请求。让我们说它需要5秒才能完成两次获取。

如果我像这样做一个简单的缓存:

    const cache={};

    app.get('/',(req,res)=>{
        if(cache['mykey']==undefined 
           || cache['mykey'].timestamp>new Date().getTime()-15000){
// make or refresh cache;
            Promise.all(fetch(url1),fetch(url2))
                .then(i=>{
                    cache['mykey'].timestamp=new Date().getTime();
                    cache['mykey'].value=i
                    return i;
                })
                .then(i=>res.send(i))
        }else{
            res.send(cache['mykey'].value);
            // or res.status(304).send()
        }
    }

如果在缓存刷新阶段中发出2个或更多请求,则无效。如何每15分钟只刷新一个缓存?

希望我很清楚。

答案

这是一个未经测试的大纲:

let cache = false

app.get('/', function(req, res) {
    cache = cache || Promise.all([
        fetch('url1'),
        fetch('url2')
    ]).then(results => {
        setTimeout(() => cache = false, 15 * 1000);
        return results;
    });

    const result = cache 

    result.then(([result1, result2]) => {
        res.json({ result1, result2 });
    });
});

以上是关于在expressJS中如何创建一个缓存,使多个请求等待相同的promise [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ExpressJs 中使用时 JWT 中的多个问题

如何避免从 ExpressJS 抛出 400 错误

如何在 ExpressJS 中使用 axios?

如何将用户凭据附加到 expressjs 中的请求管道?

expressjs req.url 路径如何成为另一个url?

如何使用 express js 处理 fetch API 请求