Я создаю веб-сервер в nodejs, который использует redis, postgresql и mongodb. Я храню все учетные данные в секретном менеджере Google Cloud, поэтому мне нужно использовать асинхронные функции для их получения. Мой код до сих пор:
// Redis.js
const { accessSecretVersion } = require('./google_cloud/secret-manager')
const Redis = require('redis')
// initialize connection (promise because accessSecretVersion is an async function)
const initialize = new Promise(async (resolve, reject) => {
const redis = Redis.createClient({
host: await accessSecretVersion('redis_host'),
port: 6379
})
redis.on('error', err => reject(err))
redis.on('connect', () => resolve(redis))
})
module.exports = {
initialize
}
// App.js
'use strict'
const express = require('express')
const app = express()
const bodyParser = require('body-parser')
app.use(bodyParser.json())
const Redis = require('./redis')
let redis
// try to initialize a connection
// then => it works!
// catch => it does not work!
Redis.initialize.then(redis => {
redis = redis
console.log('redis available')
}).catch(err => console.log(err))
// further on, other stuff rely on 'redis'
// if 'redis' is undefined, they crash, but I want a graceful "shutdown" of the functions
// here, the emitter relies on 'redis'
// the problem is, this code is ran BEFORE the redis connection
// has established, so it returns an empty
// (when this code runs, 'redis' is still undefined)
const Io = require('./components/socket_io/emitter')(redis)
Как вы можете видеть, в приложении. js, я пытаюсь создать соединение redis. В случае успеха (разрешить в redis. js), «let redis» установлен на соединение redis. Если нет (отклонить), я регистрирую ошибку в консоли.
Проблема в том, что некоторые другие функции этого кода зависят от соединения redis, например socket.io-redis / socket.io-emitter.
Чего я хочу достичь?
Если сервер Redis не работает, я хочу отправить глобальный код состояния 503 (служба недоступна), независимо от того, какой маршрут запрашивается , Сервер не должен создавать sh, но не должен быть доступным, потому что многие функции на моем сервере зависят от данных в базе данных Redis, и без этих данных я не хочу, чтобы люди что-то делали.
Это, вероятно, не лучший подход, который я делаю + это хорошая идея отправить "глобальную" ошибку 503, или лучше проверять каждый отдельный маршрут?