【问题标题】:Mongoose.connect not throwing any error, when Mongodb is not running当 Mongodb 未运行时,Mongoose.connect 不会引发任何错误
【发布时间】:2020-05-30 20:35:10
【问题描述】:

已解决:如果有人感兴趣,似乎 MongoDB 只是在 Windows 启动时自动启动...

我有这个函数来初始化 Mongoose 连接:

const mongoose = require('mongoose');

let db;

async function initDD(){
    try {
       db  = await  mongoose.connect('mongodb://localhost:27017/local', { useNewUrlParser: true });   

    } catch (error) {
        console.log('mongoose error',error)//Doesn't come to this...
    }

}

即使我还没有启动我的 MongoDB 服务,这个承诺也不会被拒绝。我也尝试了回调版本 - 结果相同。我显然没有运行任何 MongoDB,但 Mongoose 会“连接”,就好像没有任何问题一样。

这可能是什么问题?我有一个标准的 MongoDB 设置、最新的 Mongoose、Windows 7 和 Node 10。

编辑:“db”的记录值,当没有 MogoDB 运行时:

Mongoose {
  connections:
   [ NativeConnection {
       base: [Circular],
       collections: [Object],
       models: [Object],
       config: [Object],
       replica: false,
       options: null,
       otherDbs: [],
       relatedDbs: {},
       states: [Object],
       _readyState: 1,
       _closeCalled: false,
       _hasOpened: true,
       plugins: [],
       _listening: false,
       _connectionOptions: [Object],
       name: 'local',
       host: 'localhost',
       port: 27017,
       user: undefined,
       pass: undefined,
       client: [MongoClient],
       '$initialConnection': [Promise],
       db: [Db] } ],
  models: { User: Model { User } },
  modelSchemas:
   { User:
      Schema {
        obj: [Object],
        paths: [Object],
        aliases: {},
        subpaths: {},
        virtuals: [Object],
        singleNestedPaths: {},
        nested: {},
        inherits: {},
        callQueue: [],
        _indexes: [],
        methods: {},
        methodOptions: {},
        statics: {},
        tree: [Object],
        query: {},
        childSchemas: [],
        plugins: [Array],
        '$id': 1,
        s: [Object],
        _userProvidedOptions: {},
        options: [Object],
        '$globalPluginsApplied': true } },
  options: { pluralization: true, [Symbol(mongoose:default)]: true },
  _pluralize: [Function: pluralize],
  Schema:
   { [Function: Schema]
     reserved:
      [Object: null prototype] {
        populated: 1,
        remove: 1,
        validate: 1,
        toObject: 1,
        schema: 1,
        save: 1,
        modelName: 1,
        get: 1,
        isNew: 1,
        isModified: 1,
        init: 1,
        errors: 1,
        db: 1,
        collection: 1,
        removeListener: 1,
        listeners: 1,
        once: 1,
        on: 1,
        emit: 1,
        prototype: 1 },
     Types:
      { String: [Function],
        Number: [Function],
        Boolean: [Function],
        DocumentArray: [Function],
        Embedded: [Function: SingleNestedPath],
        Array: [Function],
        Buffer: [Function],
        Date: [Function],
        ObjectId: [Function],
        Mixed: [Function],
        Decimal: [Function],
        Decimal128: [Function],
        Map: [Function: Map],
        Oid: [Function],
        Object: [Function],
        Bool: [Function],
        ObjectID: [Function] },
     ObjectId:
      { [Function: ObjectId]
        schemaName: 'ObjectId',
        get: [Function],
        _checkRequired: [Function],
        _cast: [Function: castObjectId],
        cast: [Function: cast],
        checkRequired: [Function] } },
  model: [Function],
  plugins:
   [ [ [Function], [Object] ],
     [ [Function], [Object] ],
     [ [Function], [Object] ],
     [ [Function], [Object] ] ] }

【问题讨论】:

  • 你能记录下db变量的值吗?
  • 检查我编辑的帖子
  • 你能在终端/cmd上连接MongoDB吗?
  • 我现在在我的 Windows“服务”选项卡中看到正在运行的 mongoDB。 MongoDB 是否可以自动连接?
  • 请停止该服务,然后再次检查。

标签: javascript node.js mongodb mongoose


【解决方案1】:

我也有 Windows。安装 Mongo 后,它会在后台运行,这很好,否则您每次都必须手动启动 mongod 实例。

我更喜欢使用then/catch,即使现在支持try/catch

mongoose.connect(
        'mongodb://localhost:27017/test',{
            useNewUrlParser: true,
            useCreateIndex: true,
            useFindAndModify: false,
            useUnifiedTopology: true
        }
    )
    .then(() => console.log('DB Connection Successfull'))
    .catch((err) => {
        console.error(err);
    });

如果您不想缓冲模型,从而产生令人困惑的行为,则需要在架构上或全局禁用它:

https://mongoosejs.com/docs/guide.html#bufferCommands https://mongoosejs.com/docs/connections.html#buffering

参考:mongoose docs

【讨论】:

    【解决方案2】:

    我不确定。但我认为您应该执行该功能。 等待initDD()。 只需少量代码即可了解发生了什么。

    类似的东西

    //database.js

    const mongoose = require("mongoose");
      async function connect() {
      await mongoose.connect(process.env.DATABASE_SERVER, {
       useNewUrlParser: true
      });
      if (mongoose.connection.readyState === 1) {
       console.log("Successfully connected to database");
      }
     }
    module.exports = { connect };
    

    // index.js

    const app = require("./app");
    const { connect } = require("./database");
    async function main() {
     // dayabase conexion
     await connect();
     // start server
     const port = process.env.PORT || 4000;
     await app.listen(port, () => console.log(`Server on port ${port} `));
    }
    main();
    

    将 process.env.DATABASE_SERVER 替换为 'mongodb://localhost:27017/local'

    【讨论】:

    • 我认为“问题”只是 mongodb 在 Windows 启动时运行,我没有意识到:D
    【解决方案3】:

    试试 MongoClient.connect

    async function initDD() {
      try {
        await MongoClient.connect("mongodb://localhost:27017/test", {
          useNewUrlParser: true
        });
      } catch (error) {
        console.log("error is ->" + error);
      }
    }
    initDD();
    

    错误是 -

    error is ->MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
    

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多