5

感谢您就以下事项提供任何帮助。在广泛研究以下内容但未发现任何内容时,NodeJS MongoDB 驱动程序似乎存在问题或对 mongoose 的更改导致以下错误:“MongoError:没有可用的 mongos 代理”

例如,使用以下模块时:

const mongoose = require("mongoose");

//Setup with native ES6 Promise Library
mongoose.Promise = Promise;

//Setup UUID type i.e. const { UUID } = mongoose.Types;
require("mongoose-uuid2")(mongoose);

//Extend mongoose object with uuid operations - uuid.v4 method i.e. mongoose.uuid.v4
const uuid = require("uuid/v4");

//Extend mongoose object - Setup bson type - i.e. mongoose.bson
const bson = require("bson");

//Extend mongoose object - Setup Url type i.e. - mongoose.SchemaTypes.Url
require("mongoose-type-url");

//Extend mongoose object - Setup extend_schema i.e. - mongoose.extend_schema();
const extend_schema = require("mongoose-extend-schema");

/*
 *Initializes new instance of mongoose, sets up instance, provides reference to instance
 *Wires up the models to the instance
 *Defaults to test database using uri string
 */
class MongooseSetupService {

  constructor(uri = "mongodb://localhost:27017/test", debug = false) {

    const db = mongoose.connection;

    mongoose.uuid = uuid;
    mongoose.bson = bson;
    mongoose.extend_schema = extend_schema;

    this._database_uri = uri;
    this._mongoose = mongoose;

    mongoose.connect(this._database_uri, { "useNewUrlParser": true });
    mongoose.set("debug", debug);
    MongooseSetupService.listen(db);
  }

  get mongoose () {
    return this._mongoose;
  }

  static listen(db) {
    db.on("error", (error) => {
      console.error(`MongoDB connection error: ${error}`);
    });

    db.on("open", () => {
      console.log("Connected to MongoDB");
    });

    db.on("connected", () => {
      console.log(`Mongoose default connection open to ${this._database_uri}`);
    });

    db.on("disconnected", () => {
      console.log("Mongoose default connection disconnected");
    });

    //If the Node process ends, close the Mongoose connection
    process.on("SIGINT", () => {
      db.close(() => {
        console.log("Mongoose default connection disconnected through app termination");
        process.exit(0);
      });
    });
  }
}

module.exports = MongooseSetupService;

如果我尝试使用它,例如:

const MongoSetupService = require('./test2')

const mongo_setup_service = new MongoSetupService(
    'mongodb://user:password@server-1.domain.com:27017,server-2.domain.com:27017,server-3.domain.com:27017/db?ssl=true&replicaSet=rs0', true 
);

我收到以下错误消息:

MongoError: no mongos proxy available

这是 package.json 依赖项

"dependencies": {
    "bson": "^3.0.0",
    "mongodb": "^3.1.1",
    "mongoose": "^5.2.1",
    "mongoose-extend-schema": "git+https://github.com/thxmike/mongoose-extend-schema.git",
    "mongoose-type-url": "^1.0.4",
    "mongoose-uuid2": "^2.1.0",
    "uuid": "^3.3.2"
  }

最近版本的 Mongoose (5.2.1) 开始发生这种情况,它使用的是 NodeJS MongoDB 驱动程序的 3.1.1。调试日志提供了错误消息。对此问题的任何帮助表示赞赏。


经过进一步调查,选项 { useNewUrlParser: true } 似乎有问题。这是由于连接提供的警告消息而添加的。如果我删除此选项,问题就会消失。此外,如果我从连接字符串 uri 中删除 &replicaSet=rs0,问题就会再次出现。有趣的是这个驱动程序如何使用不同的设置。如果提供有关这些设置的更多信息,那就太好了。

4

0 回答 0