问题
Works:
var mongoose = require('mongoose');
var db = function() {
return {
config: function(conf) {
mongoose.connect('mongodb://' + conf.host + '/' + conf.database);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback() {
console.log('db connection open');
});
}
};
};
module.exports = db();
Doesn't work:
var mongoose = require('mongoose');
var db = function() {
return {
config: function(conf) {
var db = mongoose.createConnection('mongodb://' + conf.host + '/' + conf.database);
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback() {
console.log('db connection open');
});
}
};
};
module.exports = db();
Insert code:
'use strict';
var mongoose = require('mongoose'),
User = mongoose.model('User'),
p = require('../lib/promise');
...
app.post('/user', function (req, res) {
res.format({
json: function () {
//extract the user from the req
try {
var user = new User();
user.firstName = req.body.firstName;
user.lastName = req.body.lastName;
user.userName = req.body.userName;
user.password = req.body.password;
user.email = req.body.email;
user.save(function(err, data) {
//omitted
...
回答1:
Unfortunately, this isn't a simple refactor.
1) .createConnection
vs .connect
When using .createConnection
, you access models via the explicit connection you create with this call.
This means that instead of User = mongoose.model(...)
you need User = db.model(...)
.
Examples (one, two, three, four) show this isn't complicated but the change is subtle enough that many people miss it. The docs aren't super clear on this either, which is probably the root cause.
2) your kraken app & .createConnection
If you are building on one of the kraken examples, you'll need to make several changes.
- Change the code around
.createConnection
so you can access the object that is returned. In the current form, you are returning an object with aconfig
function but you don't return the connection object that.createConnection
generates. - Update
index.js
if you change the way you configure/create the connection indb.config
. You might be able to avoid this, but I suspect you'll rewrite the entiredb.js
around the new call. - Make sure code/controllers working with models have access to the object your
.createConnection
returned. This means both a way to access the object and changing anyplace you set a variable so it uses the formatvar xyz = db.model('XYZ')
, etc.
Sorry that there isn't a simple one-line answer...
来源:https://stackoverflow.com/questions/22786374/queries-hang-when-using-mongoose-createconnection-vs-mongoose-connect