Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 数据库不可用时阻止路由(正常关闭)_Node.js_Redis_Node Redis - Fatal编程技术网

Node.js 数据库不可用时阻止路由(正常关闭)

Node.js 数据库不可用时阻止路由(正常关闭),node.js,redis,node-redis,Node.js,Redis,Node Redis,我正在nodejs中构建一个web服务器,它依赖于redis、postgresql和mongodb。我将所有凭证存储在google cloud secret manager中,因此我必须使用异步函数来获取它们。到目前为止,我的代码是: // Redis.js const { accessSecretVersion } = require('./google_cloud/secret-manager') const Redis = require('redis') // initialize

我正在nodejs中构建一个web服务器,它依赖于redis、postgresql和mongodb。我将所有凭证存储在google cloud secret manager中,因此我必须使用异步函数来获取它们。到目前为止,我的代码是:

// 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)

如您所见,在app.js上,我尝试创建一个redis连接。如果成功(在redis.js中解析),“let redis”设置为redis连接。如果不是(拒绝),我将在控制台中记录错误

问题是此代码中的其他一些函数依赖于redis连接,如socket.io-redis/socket.io-emitter

我想要实现什么?

如果redis服务器关闭,我想发送一个全局状态代码503(服务不可用),无论请求什么路由。服务器不应该崩溃,但不应该是可访问的,因为我的服务器中的许多功能依赖于redis数据库中的数据,没有这些数据,我不希望人们做任何事情


这可能不是我正在做的最佳方法+发送“全局”错误503是个好主意,还是检查每个不同的路由更好?

您不应该在应用程序级别执行此操作。理想情况下,它应该由您的infra处理


在应用程序级别,实现健康检查路线,并在那里执行您的逻辑。如果mysql或redis关闭,返回500错误。infra将看到该错误并停止将流量路由到该实例/服务器/容器。

谢谢您的评论!