node.js - 无法连接到 MongoClient.connect 内的 Redis

标签 node.js mongodb express redis

我在 MongoClient.connect 中连接 Redis 时遇到问题。

虽然两者都是分开工作的,但在 mongo 的回调中,Redis 无法连接。

我的文件结构是这样的:

mongoUtil.js:

const chalk       = require( 'chalk' )
const MongoClient = require( 'mongodb' ).MongoClient
const appConfig   = require( '../config/appConfig' )

let _db

module.exports = {

 connectToServer: callback => {
   MongoClient.connect(
     appConfig.MONGO_URL,
     { promiseLibrary: Promise },
     ( err, db ) => {
       _db = db;
       console.log( chalk.blue('Connected to MongoDB') )
       callback( err )
     }
   )
 },

 getDb: function() {
  return _db;
 }
}

redisUtil.js:

const chalk       = require( 'chalk' )
const redis       = require('redis')

let client        = redis.createClient()

module.exports = {

  connectToServer : callback => {
    client.on('connect', () => {
    console.log( chalk.red('Connected to Redis') )
    callback()
   } )
},

  getDb: function() {
    return client;
  }
}

server.js:这不起作用

const mongoUtil     = require( './lib/mongoUtil' )
const redisUtil     = require( './lib/redisUtil' )

mongoUtil.connectToServer( err => {

  redisUtil.connectToServer( () => {
    // some server code
  })

})

server.js:这有效

const mongoUtil     = require( './lib/mongoUtil' )
const redisUtil     = require( './lib/redisUtil' )

redisUtil.connectToServer( () => {
  // some server code
})    

mongoUtil.connectToServer( err => {

})

最佳答案

我怀疑这是一个时间问题。当您调用 redisUtil.connectToServer 时,与 Redis 的连接已经建立,因此 connect 事件不会触发。调用 redis.createClient() 将尝试立即连接,它不会等待您注册 connect 事件监听器。

在我的脑海中,类似这样的东西应该有效:

connectToServer: callback => {
    if (client.connected) {
        console.log(chalk.red('Already connected to Redis'));
        callback();
    }
    else {
        client.on('connect', () => {
            console.log(chalk.red('Connected to Redis'));
            callback();
        }
    }
)

我不确定如果客户端正在重新连接过程中这是否有效。当一个名为 connectToServer 的函数不负责启动连接时,它也是相当具有误导性的。您可能需要考虑调整代码,以便在 connectToServer 内部调用 createClient,这更像是使用 Mongo 的方式。

关于node.js - 无法连接到 MongoClient.connect 内的 Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46791935/

相关文章:

javascript - 如何在 Stripe webhook 中获取产品 ID

node.js - api 路由无法通过 https 运行

node.js - 如何在事件处理程序中实现异步/等待?

javascript - Node.js:如何在不执行模块的情况下加载模块?

javascript - 通过ObjectID express js查找用户

java - 嵌套 Json 聚合

mongodb - mongoengine中文档的特定字段列表

javascript - 如何返回对象而不是字符串来响应诺克?

javascript - 将java对象分配给node.js变量

node.js - 手动调用 passport 进行身份验证