查询在使用mongoose.createConnection()与mongoose.connect()时挂起

作品:

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(); 

不起作用:

 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(); 

插入代码:

 '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) .createConnection.createConnection

使用.createConnection ,可以通过使用此调用创build的显式连接访问模型。

这意味着,而不是User = db.model(...)你需要User = db.model(...)

例子( 一 , 二 , 三 , 四 )表明这并不复杂,但这种变化是微妙的, 许多人都会错过它 。 这个文档也不是很清楚,这可能是根本原因。

2)你的kraken应用程序和.createConnection

如果您正在构build一个kraken示例,则需要进行一些更改。

  1. 更改.createConnection的代码,以便可以访问返回的对象。 在当前窗体中,您正在使用config函数返回对象,但不返回.createConnection生成的连接对象。
  2. 如果更改在db.configconfiguration/创build连接的方式,请更新index.js 。 你可能可以避免这种情况,但是我怀疑你会在新的调用中重写整个db.js
  3. 确保使用模型的代码/控制器可以访问.createConnection返回的对象。 这意味着访问对象和更改任何你设置variables的地方,所以它使用格式var xyz = db.model('XYZ')

对不起,没有一个简单的单行答案…