我是新来使用mongoose,想知道是什么的根本区别mongoose.connect()和mongoose.createConnection(),特别是在一般使用一个比另一个的时候有什么事情要考虑.
我对官方文档的理解是,一般只有一个连接mongoose.connect()使用,而如果有多个连接实例mongoose.createConnection()则使用.
希望有人能够澄清更多关于此的内容.
另外,如果我的理解是正确的,mongoose.createConnection()在单一连接中使用有什么缺点?为什么我们不建议mongoose.createConnection()每个案例都使用标准化连接?
我正在使用express 3.x和mongoose 3.6.4.
到目前为止,我一直在我的express apps.js文件中创建一个mongoose连接,如下所示:
var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/mytest');
Run Code Online (Sandbox Code Playgroud)
然后我将我的模型分成单独的文件,如models/user,如下所示:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var userSchema = new Schema({
userId: ObjectId,
givenName:String ...
});
exports.User = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
然后在多个路由文件中,我使用了User模型,如下所示:
var User = require('./models/user').User;
User.findById(id, function(err, user){ ...
Run Code Online (Sandbox Code Playgroud)
这对当地的发展很有帮助.所有型号共享相同的连接.
但是现在我想使用mongoose.createConnection()并创建一个可以类似方式使用的连接池.我想在应用程序启动时建立一个连接池,并为所有模型使用池.所以,我试过这个:
var conn = mongoose.createConnection("localhost","dpatest", 27017,{user:"???",pass:"???"});
Run Code Online (Sandbox Code Playgroud)
但模型不会自动共享连接.所以,我尝试了各种各样的东西,比如导出连接并尝试在模型中使用它.但除了为每个模型建立单独的连接之外,没有任何其他工作.
有人可以解释如何使用mongoose.createConnection()创建单个连接池吗?
以下是关于我的问题的更多信息:
/************ app.js *****************/
var http = require('http');
var path = require('path');
var express = require('express');
//these are my routing files
var auth = require('./src/auth'); …Run Code Online (Sandbox Code Playgroud) 我正在经历一些错误情况,试图了解如何处理这些情况.
在没有数据库连接的情况下,Mongoose Model.find(...)调用似乎挂起.下面是示例代码.我会假设使用err对象调用回调,但事实并非如此.
如何防止模型调用挂起?readyState每次访问模型时,是否需要手动检查?
// app.js
// Let's use a non-existing host so connecting fails:
// (callback is invoked with err object)
mongoose.connect('mongodb://localhostXXX/blog', function(err){ ... });
BlogPost = mongoose.model('BlogPost', BlogPostSchema);
// api.js
exports.list_posts = function(req, res) {
// Ready state is '0' = disconnected (since we used a wrong hostname)
console.log('DB ready state: ' + BlogPost.db.readyState);
// This will not invoke the callback:
BlogPost.find(function(err, threads) {
// Never called...
});
}
Run Code Online (Sandbox Code Playgroud) 我已经研究猫鼬三天了,我对使用这两种方法感到有点困惑(我知道将来会弃用"mongoose.connection()"......)
问题是:当我尝试转换(从"mongoose.connection()"转换为"mongoose.createConnection()")此示例的action.js文件https://gist.github.com/2785463似乎不适合我......
这是我的代码......
var mongoose = require('mongoose'),
db = mongoose.createConnection('localhost', 'test');
db.on('error', function () {
console.log('Error! Database connection failed.');
});
db.once('open', function (argument) {
console.log('Database connection established!');
mongoose.connection.db.collectionNames(function (error, names) {
if (error) {
console.log('Error: '+ error);
} else {
console.log(names);
};
});
});
Run Code Online (Sandbox Code Playgroud)
并且有我的终端输出(在我的ubuntu终端上键入"node test.js"..)
Database connection established!
/home/_user_/Scrivania/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:437
throw err;
^
TypeError: Cannot call method 'collectionNames' of undefined
at NativeConnection.<anonymous> (/home/_user_/Scrivania/test2.js:11:25)
at NativeConnection.g (events.js:192:14)
at NativeConnection.EventEmitter.emit (events.js:93:17)
at open (/home/_user_/Scrivania/node_modules/mongoose/lib/connection.js:408:10)
at NativeConnection.Connection.onOpen (/home/_user_/Scrivania/node_modules/mongoose/lib/connection.js:415:5)
at Connection._open (/home/_user_/Scrivania/node_modules/mongoose/lib/connection.js:386:10) …Run Code Online (Sandbox Code Playgroud)