Hướng dẫn mongodb connection timeout - hết thời gian kết nối mongodb

Không giống như MySQL, MongoDB dễ dàng xử lý để tổ chức dữ liệu không có cấu trúc lớn trong các ứng dụng như & NBSP; eBay, MetLife, Facebook, Shutterfly, v.v.

Nhưng trong khi kết nối, người dùng ứng dụng có thể gặp phải lỗi như thời gian chờ kết nối MongoDB.

Lỗi này xảy ra do cài đặt máy chủ MongoDB sai, BAD & NBSP; Các tham số kết nối và nhiều hơn nữa.

Đó là lý do tại sao, tại Bobcares, chúng tôi thường nhận được các yêu cầu từ khách hàng của mình để giải quyết lỗi thời gian chờ kết nối MongoDB như một phần của Dịch vụ Quản lý Máy chủ của chúng tôi.

Hôm nay, chúng tôi sẽ thấy cách các kỹ sư hỗ trợ của chúng tôi khắc phục lỗi thời gian chờ kết nối & các vấn đề liên quan của nó.

Thời gian chờ kết nối MongoDB là gì?

Thời gian chờ kết nối xác định lượng thời gian phản hồi tối đa chờ đợi kết nối được thiết lập bởi máy chủ.

Giá trị này được sử dụng khi tạo kết nối ban đầu với cơ sở dữ liệu MongoDB.

Giá trị thời gian chờ kết nối mặc định dao động từ 1 giây đến 30 giây.

Ví dụ: nếu bạn có thời gian chờ kết nối được đặt thành 30 giây, các ứng dụng của bạn sẽ không bao giờ chờ hơn 30 giây cho kết quả.

Top 2 nguyên nhân và sửa chữa phổ biến hàng đầu

Hãy cùng xem xét kỹ hơn về nguyên nhân & cách các kỹ sư hỗ trợ của chúng tôi đã sửa nó.

1. Cài đặt xấu của máy khách MongoDB

Gần đây, một trong những khách hàng của chúng tôi đã tiếp cận chúng tôi với một vấn đề liên quan đến kết nối MongoDB. Khi anh ta cố gắng kết nối MongoDB bằng máy khách MongoDB, nó đã dẫn đến một hộp thông báo lỗi máy chủ cho thấy lỗi thời gian chờ kết nối.

Điều này thường xảy ra do cài đặt trong máy khách MongoDB. Khi máy khách mất quá nhiều thời gian để kết nối với máy chủ MongoDB so với giá trị thời gian chờ đặt trước, nó có thể dẫn đến lỗi.

Và sửa chữa liên quan đến việc tăng giới hạn thời gian chờ đối với máy khách MongoDB. Đối với điều này, trước tiên chúng tôi kiểm tra với khách hàng trên các cài đặt mà họ sử dụng trên khách hàng của họ. Sau đó, chúng tôi so sánh các giá trị được đặt trong máy chủ MongoDB. Tùy thuộc vào các giá trị, chúng tôi đề xuất điều chỉnh các biến.

Ví dụ, trong trường hợp của khách hàng này, đó là thời gian chờ gây ra vấn đề. Do đó, chúng tôi đặt thời gian nhàn rỗi kết nối tối đa thành giá trị cao hơn và điều này đã giải quyết vấn đề. Bây giờ, người dùng có thể kết nối với MongoDB bằng máy khách MongoDB.

2. Thông số kết nối sai

Thường thì lỗi này xảy ra khi có cài đặt không chính xác trong tham số kết nối. Trong những trường hợp như vậy, chúng tôi sửa đổi các cài đặt bằng cách điều hướng đến cơ sở dữ liệu trong MongoDB.

Ví dụ: chúng tôi điều chỉnh các cài đặt trong trường cơ sở dữ liệu như thế này.

MONGO_URI=mongodb://user::27017/dbname?keepAlive=true&poolSize=30&autoReconnect=true&socketTimeoutMS=360000&connectTimeoutMS=360000

3. Tường lửa khối IP

Tương tự, khách hàng DigitalOcean đã báo cáo chúng tôi rằng sau khi tạo MongoDB, anh ấy không thể kết nối với cơ sở dữ liệu bằng Node.js. Nó dẫn đến một lỗi như

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'

Lỗi này là phổ biến nhất với MongoDB và xảy ra khi kết nối bị Tường lửa bỏ rơi.

Vì vậy, để giải quyết vấn đề, các kỹ sư hỗ trợ của chúng tôi đã mở cài đặt tường lửa ở phía máy chủ và cho phép IP tương ứng cho phép kết nối.

[Gặp rắc rối với thời gian chờ kết nối trong MongoDB? Chúng tôi sẽ sửa nó cho bạn.]

Sự kết luận

Chính xác hơn, MongoDB được sử dụng rộng rãi trên các ứng dụng web khác nhau. Nhưng, các lỗi như thời gian chờ kết nối MongoDB xảy ra do các cài đặt sai trong máy chủ MongoDB, các tham số kết nối xấu và nhiều hơn nữa. Hôm nay, chúng tôi đã thấy cách các kỹ sư hỗ trợ của chúng tôi đã sửa 3 lỗi phổ biến hàng đầu.

Ngăn chặn máy chủ của bạn bị sập!

Đừng bao giờ mất khách hàng với tốc độ máy chủ kém! Hãy để chúng tôi giúp bạn.

Các chuyên gia máy chủ của chúng tôi sẽ giám sát và duy trì máy chủ của bạn 24/7 để nó vẫn nhanh như chớp và an toàn.

BẮT ĐẦU

var google_conversion_label = "owoncmyg5neq0ad71qm";

Kết nối

Bạn có thể kết nối với MongoDB với phương pháp

mongoose.connect('mongodb://username:password@host:port/database?options...');
0.

mongoose.connect('mongodb://localhost:27017/myapp');

Đây là mức tối thiểu cần thiết để kết nối cơ sở dữ liệu

mongoose.connect('mongodb://username:password@host:port/database?options...');
1 chạy cục bộ trên cổng mặc định (27017). Nếu kết nối không thành công trên máy của bạn, hãy thử sử dụng
mongoose.connect('mongodb://username:password@host:port/database?options...');
2 thay vì
mongoose.connect('mongodb://username:password@host:port/database?options...');
3.

Bạn cũng có thể chỉ định một số tham số khác trong

mongoose.connect('mongodb://username:password@host:port/database?options...');
4:

mongoose.connect('mongodb://username:password@host:port/database?options...');

Xem thông số chuỗi kết nối MongoDB để biết thêm chi tiết.

  • Bộ đệm
  • Xử lý lỗi
  • Tùy chọn
  • Tùy chọn chuỗi kết nối
  • Sự kiện kết nối
  • Một lưu ý về Keepalive
  • Lựa chọn máy chủ
  • Bản sao đặt kết nối
  • Bản sao đặt tên máy chủ
  • Hỗ trợ nhiều người
  • Nhiều kết nối
  • Nhóm kết nối

Mỗi message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'46, cho dù được tạo bằng message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'47 hoặc message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'48 đều được hỗ trợ bởi nhóm kết nối có thể cấu hình bên trong mặc định ở kích thước tối đa là 100. Điều chỉnh kích thước nhóm bằng các tùy chọn kết nối của bạn:

mongoose.connect('mongodb://localhost:27017/myapp');
9

Tiếp theo

Bây giờ chúng tôi đã đề cập đến các kết nối, chúng ta hãy xem các mô hình.

const MyModel = mongoose.model('Test', new Schema({ name: String }));
// Will just hang until mongoose successfully connects
MyModel.findOne(function(error, result) { /* ... */ });

setTimeout(function() {
  mongoose.connect('mongodb://localhost:27017/myapp');
}, 60000);

Kết nối

mongoose.set('bufferCommands', false);

Bạn có thể kết nối với MongoDB với phương pháp

mongoose.connect('mongodb://username:password@host:port/database?options...');
0.

const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();

Xử lý lỗi

Tùy chọn

  • Tùy chọn chuỗi kết nốinot automatically try to reconnect.
  • Sự kiện kết nối

Một lưu ý về Keepalive

mongoose.connect('mongodb://localhost:27017/test').
  catch(error => handleError(error));

// Or:
try {
  await mongoose.connect('mongodb://localhost:27017/test');
} catch (error) {
  handleError(error);
}

Lựa chọn máy chủ

mongoose.connection.on('error', err => {
  logError(err);
});

Bản sao đặt kết nối

Tùy chọn

Tùy chọn chuỗi kết nối

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
0

Sự kiện kết nối

  • Một lưu ý về Keepalive
  • Lựa chọn máy chủ
  • Bản sao đặt kết nốiany model associated with this connection.
  • Bản sao đặt tên máy chủ

Dưới đây là một số tùy chọn quan trọng để điều chỉnh Mongoose.

  • const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    8 - Đặt thư viện lời hứa của người lái xe cơ bản.
  • const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    9 - Số lượng ổ cắm tối đa mà trình điều khiển MongoDB sẽ tiếp tục mở cho kết nối này. Theo mặc định,
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    9 là 100. Hãy nhớ rằng MongoDB chỉ cho phép một thao tác mỗi ổ cắm cùng một lúc, vì vậy bạn có thể muốn tăng điều này nếu bạn thấy bạn có một vài truy vấn chậm đang chặn các truy vấn nhanh hơn tiến hành. Xem các chuyến tàu chậm trong MongoDB và Node.js. Bạn có thể muốn giảm
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    9 nếu bạn đang chạy vào giới hạn kết nối.
  • mongoose.set('bufferCommands', false);
    
    2 - Số lượng ổ cắm tối thiểu mà trình điều khiển MongoDB sẽ tiếp tục mở cho kết nối này. Người lái xe MongoDB có thể đóng các ổ cắm đã không hoạt động trong một thời gian. Bạn có thể muốn tăng
    mongoose.set('bufferCommands', false);
    
    2 nếu bạn mong đợi ứng dụng của mình sẽ trải qua thời gian nhàn rỗi dài và muốn đảm bảo ổ cắm của bạn mở để tránh các chuyến tàu chậm khi hoạt động tăng lên.
  • mongoose.set('bufferCommands', false);
    
    4 - Trình điều khiển MongoDB sẽ đợi bao lâu trước khi giết một ổ cắm do không hoạt động sau khi kết nối ban đầu. Một ổ cắm có thể không hoạt động vì không có hoạt động hoặc hoạt động dài. Điều này được đặt thành
    mongoose.set('bufferCommands', false);
    
    5 Theo mặc định, bạn nên đặt điều này thành 2-3x Hoạt động chạy dài nhất của mình nếu bạn mong đợi một số hoạt động cơ sở dữ liệu của bạn sẽ chạy lâu hơn 20 giây. Tùy chọn này được chuyển đến chức năng Node.js
    mongoose.set('bufferCommands', false);
    
    6 sau khi trình điều khiển MongoDB hoàn thành thành công.
  • mongoose.set('bufferCommands', false);
    
    7 - Cho dù kết nối bằng IPv4 hoặc IPv6. Tùy chọn này được chuyển đến hàm
    mongoose.set('bufferCommands', false);
    
    8 của Node.js. Nếu bạn không chỉ định tùy chọn này, trình điều khiển MongoDB sẽ thử IPv6 trước và sau đó IPv4 nếu IPv6 không thành công. Nếu cuộc gọi
    mongoose.set('bufferCommands', false);
    
    9 của bạn mất nhiều thời gian, hãy thử
    const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    0
  • const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    1 - Cơ sở dữ liệu để sử dụng khi xác thực với
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    0 và
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    1. Trong MongoDB, người dùng được đưa vào cơ sở dữ liệu. Nếu bạn đang gặp lỗi đăng nhập bất ngờ, bạn có thể cần đặt tùy chọn này.
  • const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    4 - Trình điều khiển MongoDB sẽ cố gắng tìm một máy chủ để gửi bất kỳ hoạt động nào đến và tiếp tục thử lại cho
    const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    4 mili giây. Nếu không được đặt, trình điều khiển MongoDB mặc định sử dụng
    mongoose.set('bufferCommands', false);
    
    5 (30 giây).
  • const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    7 - Trình điều khiển MongoDB gửi nhịp tim mỗi
    const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    7 để kiểm tra trạng thái của kết nối. Một nhịp tim phải chịu
    const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    4, vì vậy người lái xe MongoDB sẽ thử lại các nhịp tim thất bại trong tối đa 30 giây theo mặc định. Mongoose chỉ phát ra một sự kiện
    mongoose.connect('mongodb://localhost:27017/test').
      catch(error => handleError(error));
    
    // Or:
    try {
      await mongoose.connect('mongodb://localhost:27017/test');
    } catch (error) {
      handleError(error);
    }
    
    0 sau khi nhịp tim thất bại, vì vậy bạn có thể muốn giảm cài đặt này để giảm thời gian giữa khi máy chủ của bạn giảm và khi Mongoose phát ra
    mongoose.connect('mongodb://localhost:27017/test').
      catch(error => handleError(error));
    
    // Or:
    try {
      await mongoose.connect('mongodb://localhost:27017/test');
    } catch (error) {
      handleError(error);
    }
    
    0. Chúng tôi khuyên bạn không nên đặt cài đặt này dưới 1000, quá nhiều nhịp tim có thể dẫn đến suy giảm hiệu suất.not set this setting below 1000, too many heartbeats can lead to performance degradation.

Tùy chọn

const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();
4 cũng xử lý thời gian
mongoose.connect('mongodb://username:password@host:port/database?options...');
0 sẽ thử lại kết nối ban đầu trước khi lỗi.
mongoose.connect('mongodb://username:password@host:port/database?options...');
0 sẽ thử lại trong 30 giây theo mặc định (mặc định
const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();
4) trước khi lỗi. Để nhận được phản hồi nhanh hơn về các hoạt động thất bại, bạn có thể giảm
const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();
4 xuống 5000 như được hiển thị bên dưới.

Example:

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
1

Xem trang này để biết thêm thông tin về

mongoose.connect('mongodb://localhost:27017/test').
  catch(error => handleError(error));

// Or:
try {
  await mongoose.connect('mongodb://localhost:27017/test');
} catch (error) {
  handleError(error);
}
7 và
mongoose.set('bufferCommands', false);
4

Gọi lại

Hàm

mongoose.connect('mongodb://localhost:27017/test').
  catch(error => handleError(error));

// Or:
try {
  await mongoose.connect('mongodb://localhost:27017/test');
} catch (error) {
  handleError(error);
}
9 cũng chấp nhận tham số gọi lại và trả về lời hứa.

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
2

Tùy chọn chuỗi kết nối

Bạn cũng có thể chỉ định các tùy chọn trình điều khiển trong chuỗi kết nối của mình làm tham số trong phần chuỗi truy vấn của URI. Điều này chỉ áp dụng cho các tùy chọn được chuyển cho trình điều khiển MongoDB. Bạn không thể đặt các tùy chọn dành riêng cho Mongoose như

mongoose.connect('mongodb://username:password@host:port/database?options...');
5 trong chuỗi truy vấn.can't set Mongoose-specific options like
mongoose.connect('mongodb://username:password@host:port/database?options...');
5 in the query string.

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
3

Nhược điểm của việc đặt các tùy chọn vào chuỗi truy vấn là các tùy chọn chuỗi truy vấn khó đọc hơn. Ưu điểm là bạn chỉ cần một tùy chọn cấu hình duy nhất, URI, thay vì các tùy chọn riêng biệt cho

mongoose.set('bufferCommands', false);
4,
mongoose.connect('mongodb://localhost:27017/test').
  catch(error => handleError(error));

// Or:
try {
  await mongoose.connect('mongodb://localhost:27017/test');
} catch (error) {
  handleError(error);
}
7, v.v ... Thực tiễn tốt nhất là đặt các tùy chọn có khả năng khác nhau giữa phát triển và sản xuất, như
mongoose.connection.on('error', err => {
  logError(err);
});
3 hoặc
mongoose.connection.on('error', err => {
  logError(err);
});
4, trong chuỗi kết nối, trong chuỗi kết nối, và các tùy chọn vẫn không đổi, như
mongoose.connect('mongodb://localhost:27017/test').
  catch(error => handleError(error));

// Or:
try {
  await mongoose.connect('mongodb://localhost:27017/test');
} catch (error) {
  handleError(error);
}
7 hoặc
const MyModel = mongoose.model('Test', new Schema({ name: String }));
// Will just hang until mongoose successfully connects
MyModel.findOne(function(error, result) { /* ... */ });

setTimeout(function() {
  mongoose.connect('mongodb://localhost:27017/myapp');
}, 60000);
9, trong đối tượng Tùy chọn.

Các tài liệu MongoDB có một danh sách đầy đủ các tùy chọn chuỗi kết nối được hỗ trợ. Dưới đây là một số tùy chọn thường hữu ích để đặt trong chuỗi kết nối vì chúng được liên kết chặt chẽ với tên máy chủ và thông tin xác thực.

  • const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    1 - Cơ sở dữ liệu để sử dụng khi xác thực với
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    0 và
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Will just hang until mongoose successfully connects
    MyModel.findOne(function(error, result) { /* ... */ });
    
    setTimeout(function() {
      mongoose.connect('mongodb://localhost:27017/myapp');
    }, 60000);
    
    1. Trong MongoDB, người dùng được đưa vào cơ sở dữ liệu. Nếu bạn đang gặp lỗi đăng nhập bất ngờ, bạn có thể cần đặt tùy chọn này.
  • mongoose.set('bufferCommands', false);
    
    7 - Cho dù kết nối bằng IPv4 hoặc IPv6. Tùy chọn này được chuyển đến hàm
    mongoose.set('bufferCommands', false);
    
    8 của Node.js. Nếu bạn không chỉ định tùy chọn này, trình điều khiển MongoDB sẽ thử IPv6 trước và sau đó IPv4 nếu IPv6 không thành công. Nếu cuộc gọi
    mongoose.set('bufferCommands', false);
    
    9 của bạn mất nhiều thời gian, hãy thử
    const schema = new Schema({
      name: String
    }, {
      capped: { size: 1024 },
      bufferCommands: false,
      autoCreate: false // disable `autoCreate` since `bufferCommands` is false
    });
    
    const Model = mongoose.model('Test', schema);
    // Explicitly create the collection before using it
    // so the collection is capped.
    await Model.createCollection();
    
    0

Sự kiện kết nối

Các kết nối kế thừa từ lớp

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
04 của Node.js và phát ra các sự kiện khi có điều gì đó xảy ra với kết nối, như mất kết nối với máy chủ MongoDB. Dưới đây là danh sách các sự kiện mà một kết nối có thể phát ra.

  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    05: phát ra khi Mongoose bắt đầu thực hiện kết nối ban đầu với máy chủ MongoDB
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    06: phát ra khi Mongoose thành công kết nối ban đầu với máy chủ MongoDB hoặc khi Mongoose kết nối lại sau khi mất kết nối. Có thể được phát ra nhiều lần nếu Mongoose mất kết nối.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    07: phát ra sau
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    08 và
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    09 được thực thi trên tất cả các mô hình của kết nối này.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    10: Ứng dụng của bạn gọi
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    11 để ngắt kết nối với MongoDB
  • mongoose.connect('mongodb://localhost:27017/myapp');
    const MyModel = mongoose.model('Test', new Schema({ name: String }));
    // Works
    MyModel.findOne(function(error, result) { /* ... */ });
    
    5: phát ra khi Mongoose mất kết nối với máy chủ MongoDB. Sự kiện này có thể là do mã của bạn đóng rõ ràng kết nối, sự cố máy chủ cơ sở dữ liệu hoặc sự cố kết nối mạng.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    13: phát ra sau
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    11 Đóng thành công kết nối. Nếu bạn gọi
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    15, bạn sẽ nhận được cả sự kiện 'bị ngắt kết nối' và sự kiện 'đóng'.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    16: phát ra nếu Mongoose mất kết nối với MongoDB và kết nối lại thành công. Mongoose cố gắng tự động kết nối lại khi mất kết nối với cơ sở dữ liệu.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    17: phát ra nếu xảy ra lỗi trên kết nối, như
     message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    18 do dữ liệu không đúng hình hoặc tải trọng lớn hơn 16MB.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    19: phát ra khi bạn kết nối với một bộ bản sao và Mongoose đã kết nối thành công với chính và ít nhất một phụ.
  •  message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
    20: phát ra khi bạn kết nối với một bộ bản sao và Mongoose đã kết nối thành công với tất cả các máy chủ được chỉ định trong chuỗi kết nối của bạn.

Khi bạn kết nối với một máy chủ MongoDB duy nhất ("độc lập"), Mongoose sẽ phát ra 'ngắt kết nối' nếu nó bị ngắt kết nối với máy chủ độc lập và 'kết nối' nếu nó kết nối thành công với độc lập. Trong một bộ bản sao, Mongoose sẽ phát ra 'ngắt kết nối' nếu nó mất kết nối với bản sao chính và 'kết nối' nếu nó quản lý kết nối lại với bản sao chính.

Một lưu ý về Keepalive

Đối với các ứng dụng chạy dài, thường nên kích hoạt

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
21 với một số mili giây. Không có nó, sau một khoảng thời gian, bạn có thể bắt đầu thấy các lỗi
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
22 cho những gì có vẻ như không có lý do. Nếu vậy, sau khi đọc điều này, bạn có thể quyết định bật
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
21:

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
4

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
24 là số mili giây phải chờ trước khi bắt đầu
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
21 trên ổ cắm.
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
21 là đúng theo mặc định vì Mongoose 5.2.0.

Bản sao đặt kết nối

Để kết nối với một bản sao, bạn đã vượt qua danh sách các máy chủ được phân định dấu phẩy để kết nối thay vì một máy chủ duy nhất.

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
5

Ví dụ:

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
6

Để kết nối với một bộ bản sao nút duy nhất, chỉ định tùy chọn

mongoose.connection.on('error', err => {
  logError(err);
});
3.

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
7

Lựa chọn máy chủ

Trình điều khiển MongoDB cơ bản sử dụng một quy trình được gọi là lựa chọn máy chủ để kết nối với MongoDB và gửi các hoạt động đến MongoDB. Nếu trình điều khiển MongoDB không thể tìm thấy máy chủ để gửi hoạt động đến sau

const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();
4, bạn sẽ nhận được lỗi dưới đây:

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
8

Bạn có thể định cấu hình thời gian chờ bằng tùy chọn

const schema = new Schema({
  name: String
}, {
  capped: { size: 1024 },
  bufferCommands: false,
  autoCreate: false // disable `autoCreate` since `bufferCommands` is false
});

const Model = mongoose.model('Test', schema);
// Explicitly create the collection before using it
// so the collection is capped.
await Model.createCollection();
4 thành
mongoose.connect('mongodb://username:password@host:port/database?options...');
0:

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
9

Một

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
31 có thuộc tính
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
32 giải thích lý do tại sao lựa chọn máy chủ được định thời. Ví dụ: nếu bạn đang kết nối với máy chủ độc lập với mật khẩu không chính xác,
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
32 sẽ chứa lỗi "xác thực không thành công".

mongoose.connect('mongodb://localhost:27017/myapp');
0

Bản sao đặt tên máy chủ

Bản sao MongoDB dựa vào việc có thể tìm ra tên miền cho mỗi thành viên. Trên Linux và OSX, máy chủ MongoDB sử dụng đầu ra của lệnh

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
34 để tìm ra tên miền để báo cáo cho bộ bản sao. Điều này có thể gây ra các lỗi khó hiểu nếu bạn kết nối với bộ bản sao MongoDB từ xa đang chạy trên máy báo cáo
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
34 của nó là
mongoose.connect('mongodb://username:password@host:port/database?options...');
3:

mongoose.connect('mongodb://localhost:27017/myapp');
1

Nếu bạn đang gặp lỗi tương tự, hãy kết nối với bộ bản sao bằng cách sử dụng shell

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
37 và chạy lệnh
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
38 để kiểm tra tên máy chủ của từng thành viên bộ bản sao. Thực hiện theo hướng dẫn của trang này để thay đổi tên máy chủ của thành viên đã đặt bản sao.

Bạn cũng có thể kiểm tra thuộc tính

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
39 của
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
40 để xem trình điều khiển nút MongoDB nghĩ rằng trạng thái của bộ bản sao của bạn là gì. Thuộc tính
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
39 chứa bản đồ mô tả máy chủ.

mongoose.connect('mongodb://localhost:27017/myapp');
2

Hỗ trợ nhiều người

Bạn cũng có thể kết nối với nhiều trường hợp Mongo để có tính sẵn sàng cao trong cụm Sharded. Bạn không cần phải vượt qua bất kỳ tùy chọn đặc biệt nào để kết nối với nhiều Mongo trong Mongoose 5.x.

mongoose.connect('mongodb://localhost:27017/myapp');
3

Nhiều kết nối

Cho đến nay, chúng tôi đã thấy cách kết nối với MongoDB bằng kết nối mặc định của Mongoose. Mongoose tạo kết nối mặc định khi bạn gọi

mongoose.connect('mongodb://username:password@host:port/database?options...');
0. Bạn có thể truy cập kết nối mặc định bằng
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
43.

Bạn có thể cần nhiều kết nối với MongoDB vì nhiều lý do. Một lý do là nếu bạn có nhiều cơ sở dữ liệu hoặc nhiều cụm mongoDB. Một lý do khác là để làm việc xung quanh các chuyến tàu chậm. Hàm

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
44 có các đối số giống như
mongoose.connect('mongodb://username:password@host:port/database?options...');
0 và trả về một kết nối mới.

mongoose.connect('mongodb://localhost:27017/myapp');
4

Đối tượng kết nối này sau đó được sử dụng để tạo và truy xuất các mô hình. Các mô hình luôn được đưa vào một kết nối duy nhất.always scoped to a single connection.

mongoose.connect('mongodb://localhost:27017/myapp');
5

Nếu bạn sử dụng nhiều kết nối, bạn nên đảm bảo rằng bạn xuất các lược đồ, không phải các mô hình. Xuất một mô hình từ một tệp được gọi là mẫu mô hình xuất. Mẫu mô hình xuất bị hạn chế vì bạn chỉ có thể sử dụng một kết nối.not models. Exporting a model from a file is called the export model pattern. The export model pattern is limited because you can only use one connection.

mongoose.connect('mongodb://localhost:27017/myapp');
6

Nếu bạn sử dụng mẫu lược đồ xuất, bạn vẫn cần tạo các mô hình ở đâu đó. Có hai mẫu phổ biến. Đầu tiên là xuất kết nối và đăng ký các mô hình trên kết nối trong tệp:

mongoose.connect('mongodb://localhost:27017/myapp');
7

Một cách khác là đăng ký các kết nối với một kim phun phụ thuộc hoặc một mô hình đảo ngược khác của điều khiển (IOC).

mongoose.connect('mongodb://localhost:27017/myapp');
8

Nhóm kết nối

Mỗi

 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
46, cho dù được tạo bằng
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
47 hoặc
 message: 'failed to connect to server [droplet_ip:27017] on first connect [MongoError: connection 0 to droplet_ip:27017 timed out]'
48 đều được hỗ trợ bởi nhóm kết nối có thể cấu hình bên trong mặc định ở kích thước tối đa là 100. Điều chỉnh kích thước nhóm bằng các tùy chọn kết nối của bạn:

mongoose.connect('mongodb://localhost:27017/myapp');
9

Tiếp theo

Bây giờ chúng tôi đã đề cập đến các kết nối, chúng ta hãy xem các mô hình.