2014-04-01 14 views
29

trình:Queries treo khi sử dụng mongoose.createConnection() vs 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(); 

Không làm việc: Mã

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:

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

Trả lời

65

Thật không may , đây không phải là một refactor đơn giản.

1) .createConnection vs .connect

Khi sử dụng .createConnection, bạn truy cập vào mô hình thông qua kết nối rõ ràng bạn tạo với cuộc gọi này.

Điều này có nghĩa là thay vì User = mongoose.model(...) bạn cần User = db.model(...).

Ví dụ (one, two, three, four) cho thấy đây không phải là phức tạp nhưng sự thay đổi là đủ tinh tế mà many people miss it. Các tài liệu không phải là siêu rõ ràng về điều này hoặc, mà có lẽ là nguyên nhân gốc rễ.

2) ứng dụng Kraken của bạn & .createConnection

Nếu bạn đang xây dựng trên một trong những ví dụ Kraken, bạn sẽ cần phải thực hiện một số thay đổi.

  1. Thay đổi mã xung quanh .createConnection để bạn có thể truy cập đối tượng được trả về. Trong biểu mẫu hiện tại, bạn đang trả về một đối tượng có hàm config nhưng bạn không trả về đối tượng kết nối mà .createConnection tạo ra.
  2. Cập nhật index.js nếu bạn thay đổi cách bạn định cấu hình/tạo kết nối trong db.config. Bạn có thể tránh điều này, nhưng tôi nghi ngờ bạn sẽ viết lại toàn bộ số db.js xung quanh cuộc gọi mới.
  3. Đảm bảo mã/bộ điều khiển hoạt động với các kiểu máy có quyền truy cập đối tượng mà bạn trả về .createConnection. Điều này có nghĩa cả hai một cách để truy cập vào các đối tượng và thay đổi bất cứ nơi nào bạn thiết lập một biến nên sử dụng định dạng var xyz = db.model('XYZ') vv

Xin lỗi rằng có không phải là một dòng câu trả lời đơn giản ...

+1

Thank bạn rất nhiều, đã lái xe bản thân mình điên với điều này. Tôi đồng ý rằng tài liệu này gây ra nhiều vấn đề. – Seth

+7

Đây là lý do tại sao MongoDB và Mongoose bị đại diện xấu. – lazlojuly

+1

Có rất nhiều câu hỏi xung quanh với vấn đề chính xác này! Tôi vừa gửi một vấn đề về github vì điều này tạo ra quá nhiều sự thất vọng https://github.com/Automattic/mongoose/issues/4413 – cortopy

Các vấn đề liên quan