Node.js 使用Mongoose.createConnection时未执行Mongoose回调
我使用Mongoose4.12.4和Mongov3.4.9在Ubuntu上运行NodeV6.11.4。我有下面的代码来添加一个新记录,然后读回下面的内容。未执行保存(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 =
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()。