Mongolab nodejs拓扑被破坏
Posted
技术标签:
【中文标题】Mongolab nodejs拓扑被破坏【英文标题】:Mongolab nodejs topology destroyed 【发布时间】:2015-08-06 04:34:37 【问题描述】:我一直在使用 nodejs 与 twitter 交互。我正在尝试在 mongolab mongodb 数据库中记录一些重要的公共用户数据。出于某种原因,我不断收到“拓扑破坏错误”,我不太确定这是为什么。
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:pass@mongolab.com: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();
);
如您所见,程序建立了与数据库的连接。定义集合,然后遍历多个 Twitter 帐户并记录相关信息。 twitter 请求成功,mongodb 可以处理简单的请求。如果您对我收到此回复的原因有任何想法,请回答。
【问题讨论】:
【参考方案1】:我遇到了类似的问题,在您完成所有对 twitter 的请求并插入数据之前,您的数据库连接已关闭。
我最终像文档中那样向我的函数发送回调。
https://github.com/mongodb/node-mongodb-native#inserting-a-document
你可以看到插入完成后他们调用callback(result);
这只是调用db.close()
的匿名函数
这里有一些其他链接可能会帮助您打开/关闭数据库连接
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
希望对你有帮助!
【讨论】:
你的第一句话是我需要通过我的代码来修复错误的提示。 在进行批量插入的回调有机会完成其任务之前,我实际上是在关闭 Mongoose 连接。谢谢! 愚蠢的是,我收到了这个“拓扑”错误,因为我立即关闭了复制和粘贴代码的数据库连接,因此我无法执行任何其他数据库操作。至少你的链接让我更仔细地检查了我的代码。【参考方案2】:遇到同样的问题,我发现Mongolab recommends to apply the following settings是为了在生产中保持Mongodb的连接:
var options =
server: socketOptions: keepAlive: 1, connectTimeoutMS: 30000 ,
replset: socketOptions: keepAlive: 1, connectTimeoutMS: 30000
;
mongoose.connect(secrets.db, options);
我希望这对您或其他遇到“拓扑被破坏”问题的人有所帮助。
【讨论】:
connectTimeoutMS:30000后会怎样,不会再试了?默认是 30 秒吧?【参考方案3】:我遇到了同样的问题。然后我有了升级我的猫鼬库的想法。但是当我运行 npm install mongoose 时出现错误“... kerberos errors (gssapi / gssapi.h file not found) ...”。因此,经过一些研究,我发现足以解决运行 apt-get install libkrb5 -dev 或 Had Hat yum install krb5 -devel 的问题。在我做了 npm install mongoose 并解决了我的问题之后
【讨论】:
你能清理你的答案并澄清一些步骤吗?可能是对的,我就是不明白。 我只是遵循了这个建议,它对我有用。sudo aptitude install libkrb5-dev
&& rm -rf node_modules
&& npm install
就是这样。谢谢@gilmar以上是关于Mongolab nodejs拓扑被破坏的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时
破坏声明/标识符“名称”中缺少初始化程序已被声明 [mysql] [nodejs]