3

我偶然发现了一个关于 mongoose connect the mongodb 的奇怪问题,它会生成如下详细错误

    e:\Mentor_Resources\node\node_twitter_bootstrap>node app
Express server listening on port 3000
Trace: error occure when start to connect dbError: connection closed
    at e:\Mentor_Resources\node\node_twitter_bootstrap\server\module\word.js:14:
17
    at Connection.open (e:\Mentor_Resources\node\node_twitter_bootstrap\node_mod
ules\mongoose\lib\connection.js:201:5)
    at Db.open (e:\Mentor_Resources\node\node_twitter_bootstrap\node_modules\mon
goose\node_modules\mongodb\lib\mongodb\db.js:247:16)
    at Server.connect.connectionPool.on.server._serverState (e:\Mentor_Resources
\node\node_twitter_bootstrap\node_modules\mongoose\node_modules\mongodb\lib\mong
odb\connection\server.js:413:7)
    at EventEmitter.emit (events.js:115:20)
    at connection.on.connectionStatus (e:\Mentor_Resources\node\node_twitter_boo
tstrap\node_modules\mongoose\node_modules\mongodb\lib\mongodb\connection\connect
ion_pool.js:108:15)
    at EventEmitter.emit (events.js:91:17)
    at Socket.closeHandler (e:\Mentor_Resources\node\node_twitter_bootstrap\node
_modules\mongoose\node_modules\mongodb\lib\mongodb\connection\connection.js:401:
12)
    at Socket.EventEmitter.emit (events.js:88:17)
    at Socket._destroy.destroyed (net.js:364:10)

猫鼬的代码片段是:

var mongoose = require('mongoose');

mongoose.connect("mongodb://localhost/word-sentence",function(err) {
    if(err)
        console.trace('error occure when start to connect db' + err);
});

我确定mongodb是打开的,我重新启动了几次mongodb,但错误仍然存​​在,所以我重新启动了我的Windows XP,然后再试一次问题消失了,一切正常,所以我想知道为什么?

4

2 回答 2

4

当运行时间较长的应用程序中的池连接返回时,这是一个常见问题connection closed

猫鼬文档建议添加keepAlive到您传递给connect函数的选项对象。

这是一个例子(replset如果你不使用这个,你可以删除),

// include keep alive for closing connections,
// http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
var mongoOptions =
{
    db: {safe: true},
    server: {
        socketOptions: {
            keepAlive: 1
        }
    },
    replset: {
        rs_name: 'myReplSet',
        socketOptions: {
            keepAlive: 1
        }
    }
};

mongoose.connect( YOUR_URI, mongoOptions );

mongoose.connection.on('error', function(err) {
    console.log('Mongo Error:\n');
    console.log(err);
}).on('open', function() {
    console.log('Connection opened');
});
于 2015-07-14T19:59:24.673 回答
1

mongoose.connect()不接受您在代码中使用的任何回调函数,即您的猫鼬代码片段:

var mongoose = require('mongoose');

mongoose.connect("mongodb://localhost/word-sentence",function(err) {
    if(err)
        console.trace('error occurred, when attempted to connect db. Error: ' + err);
});

所以,我建议你从这个开始:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/word-sentence');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  // yay connected!
});

同样,您不能期望回调中的任何参数来自db.open('open', function cb(){})

我建议通过这些快速入门 mongoose 文档- 如果在文档和mongodb/mongoose 关闭连接中发现某些冲突,请了解如何跳转到源代码

于 2013-04-23T10:15:47.400 回答