我正在编写一个依赖于redis商店的express中间件函数,以启用速率限制。它可以工作,但问题是我将redis凭证存储在googlecloud的secretmanager中。我需要对secretmanager做一个异步请求,所以redis连接的状态有一个小的延迟。
我连接redis示例的函数返回一个承诺。当承诺完成时,redis连接就建立起来了。
'use strict'
// global variables for use in other functions as well
let globals = {}
// redis component where the connection with the redis instance is established
const Redis = require('./components/redis')
// connect is a promise
Redis.connect.then(conn => {
// connection established
globals.redis = conn
// globals.redis contains now the connection with the redis instance
// for use in other functions, this works
}).catch(err => console.log('could not connect with the redis instance')
// rate limiter function which depends on a redis instance
const RateLimiter = require('./components/rate-limiter')
const rateLimiter = RateLimiter({
store: globals.redis,
windowMs: 60 * 60 * 1000,
max: 5
})
app.use(rateLimiter)
此代码将不起作用,因为app.use(ratelimiter)是在redis连接建立之前执行的。在redis promises的then()-函数中移动ratelimiter代码不会导致错误,但是app.use()-函数在那时不起作用。
我的理想解决方案是:
// connect is a promise
Redis.connect.then(conn => {
// connection established
globals.redis = conn
// globals.redis contains now the connection with the redis instance
// for use in other functions, this works
// <-- MOVING THE RATE LIMITER CODE INSIDE THE THEN()-FUNCTION
// DOES NOT WORK / THE MIDDLEWARE IS NOT USED -->
// rate limiter function which depends on a redis instance
const RateLimiter = require('./components/rate-limiter')
const rateLimiter = RateLimiter({
store: globals.redis,
windowMs: 60 * 60 * 1000,
max: 5
})
app.use(rateLimiter)
}).catch(err => console.log('could not connect with the redis instance')
如何让app.use()'等待'直到有redis连接?
1条答案
按热度按时间mhd8tkvw1#
您可以在异步函数中设置redis,并使用async/await,如下所示: