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

bin*_*ant 36 mongoose express kraken.js

作品:

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();
Run Code Online (Sandbox Code Playgroud)

不起作用:

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();
Run Code Online (Sandbox Code Playgroud)

插入代码:

'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
...
Run Code Online (Sandbox Code Playgroud)

Mat*_*tis 77

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

1).createConnectionvs.connect

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

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

示例(,,,)表明这并不复杂,但变化微妙,很多人都错过了.文档对此也不是很清楚,这可能是根本原因.

2)你的kraken app& .createConnection

如果您正在构建其中一个海妖示例,则需要进行一些更改.

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

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

  • 这就是为什么MongoDB和Mongoose会变坏的原因. (11认同)
  • 非常感谢,这个问题快把我自己逼疯了。我同意文档导致了很多问题。 (2认同)
  • 正常情况下,我总是使用 mongoose.model('ModelName', schemaName) 并导出此模型以在其他文件中使用。如果使用 db.model('ModelName'),我如何重用旧代码?我必须始终通过参数将 db 传递给函数,并在每次对 db 执行操作时使用 db.model('ModelName') ?我很不方便 (2认同)