Node.js 使用Mongoose.createConnection时未执行Mongoose回调

Node.js 使用Mongoose.createConnection时未执行Mongoose回调,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我使用Mongoose4.12.4和Mongov3.4.9在Ubuntu上运行NodeV6.11.4。我有下面的代码来添加一个新记录,然后读回下面的内容。未执行保存(fluffy.save()) 但是,如果我使用mongoose.connect将mongoose.createConnection行替换为它上面的两行,那么整个代码都会按预期工作 // getting-started.js var mongoose = require('mongoose'); mongoose.Promise =

我使用Mongoose4.12.4和Mongov3.4.9在Ubuntu上运行NodeV6.11.4。我有下面的代码来添加一个新记录,然后读回下面的内容。未执行保存(
fluffy.save()

但是,如果我使用mongoose.connect将
mongoose.createConnection
行替换为它上面的两行,那么整个代码都会按预期工作

// getting-started.js
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
var options = {promiseLibrary: require('bluebird')};

//mongoose.connect('mongodb://localhost/test',options);
//var db = mongoose.connection;
var db = mongoose.createConnection('mongodb://localhost/test', options);

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
    console.log('We\'re Connected!');

    var kittySchema = mongoose.Schema({
        name: String
    });

// NOTE: methods must be added to the schema before compiling it with mongoose.model()
    kittySchema.methods.speak = function () {
        var greeting = this.name
                ? "Meow name is " + this.name
                : "I don't have a name";
        console.log(greeting);
    }

    var Kitten = mongoose.model('Kitten', kittySchema);

    var silence = new Kitten({name: 'Silence'});
    console.log(silence.name); // 'Silence'

    var fluffy = new Kitten({name: 'fluffy'});
    fluffy.speak(); // "Meow name is fluffy"

    fluffy.save(function (err, fluffy) {
        if (err)
            return console.error(err);
        fluffy.speak();
    }).then((val) => {
        console.log("result: " + val);
        Kitten.find({name: 'fluffy'}, function (err, kittens) {
            if (err)
                return console.error(err);
            console.log("All the kittens found: " + kittens);
        })
    }

    ).catch((err) => console.log("rejected:" + err));



});
使用mongoose.createConnection的结果:

We're Connected!
Silence
Meow name is fluffy
var mongoose = require('mongoose');
var util = require('util');

mongoose.Promise = require('bluebird');
var options = {promiseLibrary: require('bluebird'), useMongoClient: true};

var promise = mongoose.createConnection('mongodb://localhost/test', options);

promise.then(function (db) {
  var kittySchema = mongoose.Schema({
    name: String
  });

  // NOTE: methods must be added to the schema before compiling it with mongoose.model()
  kittySchema.methods.speak = function () {
    var greeting = this.name
      ? "Meow name is " + this.name
      : "I don't have a name";
    console.log(greeting);
  }

  // NOTE use db.model() instead of mongoose.model when using mongoose.createConnection()
  var Kitten = db.model('Kitten', kittySchema);

  var fluffy = new Kitten({name: 'fluffy'});
  fluffy.speak(); // "Meow name is fluffy"

  fluffy.save(function (err, fluffy) {
    if (err)
      return console.error(err);
    fluffy.speak();
  })
    .then((val) => {
      console.log("result: " + val);
      Kitten.find({name: 'fluffy'}, function (err, kittens) {
        if (err) {
          return console.error(err);
        }
        console.log("All the kittens found: " + kittens);
      })
    })
    .catch((err) => {
      console.log("Mongo save rejected:" + err);
      process.exit(1);
    }
    );
})
  .catch((err) => {
    console.error(`Error connecting to MongoDB: ${err}`);
    process.exit(1);
  }
  );

promise.on("disconnected", function () {
  console.log("Mongoose disconnected");
  process.exit(1);
});

promise.on('err', function () {
  console.error(`Error connecting to MongoDB: ${err}`);
  process.exit(1);
});
使用mongo.connect更新代码的结果:

We're Connected!
Silence
Meow name is fluffy
result: { __v: 0, name: 'fluffy', _id: 59ed75e7c414e210bc074bf3 }
Meow name is fluffy
All the kittens found: { _id: 59ed635dbcefe203f07a4b35, name: 'fluffy', __v: 0 },{ _id: 59ed63bddfb1de04351704e5, name: 'fluffy', __v: 0 },{ _id: 59ed63ee6c7ca0046872ff4e, name: 'fluffy', __v: 0 },{ _id: 59ed6f5fc816670d3bc0a09e, name: 'fluffy', __v: 0 },{ _id: 59ed6fd49319d20d8944b7e2, name: 'fluffy', __v: 0 },{ _id: 59ed74785885cf0ff23ef0ee, name: 'fluffy', __v: 0 },{ _id: 59ed75e7c414e210bc074bf3, name: 'fluffy', __v: 0 }

您可以通过以下方式使用连接:

const mongoose = require("mongoose"),
  dbURI = "mongodb://your-host(ex - localhost):your port (ex - 27017)/yourDatabaseName";

mongoose.connect(dbURI);
conn = mongoose.connection;

conn.on("connected", function(){
    console.log("Mongoose connected to " + dbURI);
});

conn.on("error", function(err){
    console.log("Mongoose connection error" + err);
});

conn.on("disconnected", function(){
    console.log("Mongoose disconnected");
});

您可以通过以下方式使用连接:

const mongoose = require("mongoose"),
  dbURI = "mongodb://your-host(ex - localhost):your port (ex - 27017)/yourDatabaseName";

mongoose.connect(dbURI);
conn = mongoose.connection;

conn.on("connected", function(){
    console.log("Mongoose connected to " + dbURI);
});

conn.on("error", function(err){
    console.log("Mongoose connection error" + err);
});

conn.on("disconnected", function(){
    console.log("Mongoose disconnected");
});
根据中的答案,在使用createConnection()时,我们必须使用db.model()而不是mongoose.model()。mongoose.model()只能与connect()一起使用。我粘贴了两个有效的解决方案

连接()的解决方案:

使用createConnection()的解决方案:

根据中的答案,在使用createConnection()时,我们必须使用db.model()而不是mongoose.model()。mongoose.model()只能与connect()一起使用。我粘贴了两个有效的解决方案

连接()的解决方案:

使用createConnection()的解决方案:


人们一直在问这个问题。不要这样做,而是使用
connect()
。请参阅手册中的。是否有一些文章或培训来源提示您认为您是使用
createConnection()
编写的?似乎非常巧合的是,似乎有大量的问题都在做同样不正确的事情。所有的问题似乎都在分配
mongoose.Promise
,而且你实际上根本没有在代码中使用承诺,这也没有逃过人们的注意。因此,一种可能的解释是看到带有
.connect()
的警告消息后得出错误的结论,而不是像消息应该告诉您的那样,直接在方法上应用
{useMongoClient:true}
和承诺/回调解析。@Neill Lunn,如果需要创建多个连接,您提供的连接表示使用mongoose.createConnection()。如果我不分配我的承诺库,我会收到以下警告:“不推荐使用警告:Mongoose:mpromise(Mongoose的默认承诺库)不推荐使用,请插入您自己的承诺库:”无论我使用connect()还是createConnection()。@Neill Lunn,我都按照文档中的说明执行了。在您复制的代码的正下方是我使用的bluebird示例。我确实按照你的建议设置了useMongoClient。在任何情况下,这些都与createConnection的错误无关。这是由于使用mongoose.model()而不是db.model()造成的。我在回答connect()和createConnection()时都粘贴了工作示例,但都没有警告消息。人们一直在问这个问题。不要这样做,而是使用
connect()
。请参阅手册中的。是否有一些文章或培训来源提示您认为您是使用
createConnection()
编写的?似乎非常巧合的是,似乎有大量的问题都在做同样不正确的事情。所有的问题似乎都在分配
mongoose.Promise
,而且你实际上根本没有在代码中使用承诺,这也没有逃过人们的注意。因此,一种可能的解释是看到带有
.connect()
的警告消息后得出错误的结论,而不是像消息应该告诉您的那样,直接在方法上应用
{useMongoClient:true}
和承诺/回调解析。@Neill Lunn,如果需要创建多个连接,您提供的连接表示使用mongoose.createConnection()。如果我不分配我的承诺库,我会收到以下警告:“不推荐使用警告:Mongoose:mpromise(Mongoose的默认承诺库)不推荐使用,请插入您自己的承诺库:”无论我使用connect()还是createConnection()。@Neill Lunn,我都按照文档中的说明执行了。在您复制的代码的正下方是我使用的bluebird示例。我确实按照你的建议设置了useMongoClient。在任何情况下,这些都与createConnection的错误无关。这是由于使用mongoose.model()而不是db.model()造成的。我在回答中粘贴了connect()和createConnection()的工作示例,但都没有警告消息。能够处理多个连接怎么样?文档建议使用mongoose.createConnection()。能够处理多个连接怎么样?文档建议使用mongoose.createConnection()。