2015-05-24 23 views
13

Tôi đã giao tiếp với twitter bằng cách sử dụng nodejs. Tôi đang cố gắng để đăng nhập một số dữ liệu người dùng công cộng quan trọng trong một cơ sở dữ liệu mongodab mongodb. Đối với một số lý do tôi tiếp tục nhận được một lỗi "topology bị phá hủy" Tôi không khá chắc chắn lý do tại sao điều này.Cấu trúc liên kết nút Mongolab nodejs bị phá hủy

var Twitter = require('twitter'); 
var mongodb = require('mongodb'); 

var accounts = ['@zaynmalik', 
'@ZooeyDeschanel']; 

var client = new Twitter({ 
    consumer_key: 'key', 
    consumer_secret: 'secret', 
    access_token_key: 'key', 
    access_token_secret: 'secret' 
}); 

var MongoClient = mongodb.MongoClient; 
var url = "mongodb://user:[email protected]:numbers/db"; 

MongoClient.connect(url, function (err, db) { 
    if (err) { 
    console.log('Unable to connect to the mongoDB server. Error:', err); 
    } else { 
    //HURRAY!! We are connected. :) 
    console.log('Connection established to database'); 

    var collection = db.collection('accounts'); 

    for(var i = 0; i < accounts.length; i++){ 
     client.get('users/show', {screen_name: accounts[i]}, function(error, tweets, response){ 
      if(error) console.log(error); 
       var account = {'screen_name': accounts[i], 'id': tweets.id}; 
       collection.insert(account, {w:1}, function(err, result) {console.log(err);}); 
       //collection.insert(account); 
       console.log(tweets.id); // Raw response object. 
     }); 

} 

    db.close(); 
    } 
}); 

Như bạn có thể thấy chương trình thiết lập kết nối với cơ sở dữ liệu. Xác định bộ sưu tập và sau đó lặp lại thông qua một số tài khoản twitter và nhật ký thông tin thích hợp. Các yêu cầu twitter thành công và mongodb hoạt động với các yêu cầu đơn giản. Nếu bạn có bất kỳ ý tưởng về lý do tại sao tôi nhận được phản hồi này, vui lòng trả lời.

Trả lời

9

Tôi đã gặp sự cố tương tự, kết nối cơ sở dữ liệu của bạn bị đóng trước khi tất cả yêu cầu của bạn lên Twitter được thực hiện và chèn dữ liệu.

Tôi đã kết thúc gửi gọi lại đến chức năng của mình giống như thực hiện trong tài liệu.

https://github.com/mongodb/node-mongodb-native#inserting-a-document

Bạn có thể thấy sau khi chèn xong họ gọi callback(result);

Và đó chỉ là chức năng ẩn danh mà các cuộc gọi db.close()

Dưới đây là một số liên kết khác có thể giúp bạn ra ngoài với mở/đóng cửa kết nối db

When to close MongoDB database connection in Nodejs

Why is it recommended not to close a MongoDB connection anywhere in Node.js code?

Keeping open a MongoDB database connection

Hy vọng nó sẽ giúp!

+0

Câu đầu tiên của bạn là gợi ý tôi cần để truy tìm mã của mình để sửa lỗi. Tôi đã theo nghĩa đen đóng kết nối Mongoose _before_ một cuộc gọi lại đã thực hiện chèn số lượng lớn có cơ hội để hoàn thành nhiệm vụ của mình. Cảm ơn! – Saheed

9

Đã từng trải qua cùng một vấn đề, tôi thấy rằng Mongolab recommends to apply the following settings để giữ kết nối MongoDB của sống trong sản xuất:

var options = { 
    server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, 
    replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } } 
}; 
mongoose.connect(secrets.db, options); 

Tôi hy vọng rằng điều này sẽ giúp bạn, hoặc những người khác có này "Topology đã bị phá hủy" Vấn đề .

1

Tôi gặp vấn đề tương tự. Sau đó, tôi đã có ý tưởng để nâng cấp thư viện mongoose của tôi. Nhưng khi tôi đang chạy npm cài đặt mongoose xuất hiện lỗi "... lỗi kerberos (gssapi/gssapi.h tập tin không tìm thấy) ...". Vì vậy, sau khi một số nghiên cứu tôi thấy rằng để giải quyết đủ để chạy apt-get install libkrb5 -dev hoặc để Had Hat yum install krb5 -devel. Sau khi tôi đã làm npm cài đặt mongoose và giải quyết vấn đề của tôi

+0

Bạn có thể làm sạch câu trả lời của mình và làm rõ một số bước không? Nó có thể đúng, tôi chỉ không hiểu nó. – blm

+0

Tôi chỉ theo lời khuyên này và nó làm việc cho tôi. 'sudo aptitude install libkrb5-dev' && ' rm -rf node_modules' && 'npm install' Và đó là nó. Cảm ơn @gilmar –

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