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

Posted

技术标签:

【中文标题】使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起【英文标题】:Queries hang when using mongoose.createConnection() vs mongoose.connect() 【发布时间】:2014-05-12 06:08:35 【问题描述】:

作品:

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】:

不幸的是,这不是一个简单的重构。

1) .createConnection.connect

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

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

示例(one、two、three、four)表明这并不复杂,但变化非常微妙,many people miss it。文档对此也不是很清楚,这可能是根本原因。

2) 你的海妖应用和.createConnection

如果您是基于其中一个 kraken 示例进行构建,则需要进行一些更改。

    更改.createConnection 周围的代码,以便您可以访问返回的对象。在当前表单中,您返回的是一个带有 config 函数的对象,但您没有返回 .createConnection 生成的连接对象。 如果您更改在db.config 中配置/创建连接的方式,请更新index.js。您或许可以避免这种情况,但我怀疑您会围绕新呼叫重写整个 db.js。 确保使用模型的代码/控制器可以访问您的.createConnection 返回的对象。这意味着既可以访问对象,又可以更改设置变量的任何位置,使其使用var xyz = db.model('XYZ') 等格式。

很抱歉没有简单的单行答案...

【讨论】:

非常感谢,我被这个逼疯了。我同意文档会导致大部分问题。 这就是 MongoDB 和 Mongoose 名声不佳的原因。 这个问题确实有很多问题!我刚刚在 github 上提交了一个问题,因为这造成了太多的挫败感github.com/Automattic/mongoose/issues/4413 像往常一样,我总是使用 mongoose.model('ModelName', schemaName) 并导出这个模型以在其他文件中使用。如果使用 db.model('ModelName'),我如何重用旧代码?而且我必须始终通过参数将 db 传递给函数并在每次对 db 执行操作时使用 db.model('ModelName') ?我很不便

以上是关于使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)