查询

时间:2016-06-10 08:34:45

标签: node.js mongodb

我使用MongoDB和Socket.IO创建了一些节点应用程序,当我插入一些文档时,每个操作都不起作用。我发现MongoDB在插入一些文件后没有插入文件(我不知道究竟有多少文件)。所以我检查了与mongodb shell的连接:

db.serverStatus().connections

在启动节点应用之前,它说:

  

{" current" :1,"可用" :3275," totalCreated" :NumberLong(639)}

插入一些文档后

  

{" current" :51,"可用" :3225," totalCreated" :NumberLong(708)}

关闭节点应用:

  

{" current" :1,"可用" :3275," totalCreated" :NumberLong(708)}

这是服务器端的代码。 (我使用外部MongoDB模块,因此它与node.js的原始MongoDB模块略有不同。这个模块只是基于Promise的API的MongoDB的简单包装器)

const app = require('http').createServer();
const io = require('socket.io')(app);
const am2 = require('am2');
...

am2.connect('localhost', '...', { ... });

const sockets = {};

io.on('connection', (socket) => {

    // save the socket into sockets object
    sockets[socket.id] = socket;

    // release socket on disconnection
    socket.on('disconnect', () => {
        delete sockets[socket.id];
    });

    ...

    // pseudo doc inserting event
    socket.on('/insert/some/docs', (data) => {
        am2.insert({ ... }).then( () => {
            socket.emit('/after/insert/some/docs', {});
        }).catch( ... );
    });
});

当客户发出' / insert / some / docs'事件,服务器将文件插入MongoDB。前几次尝试运行良好,但经过一些插入,它不再起作用了。

我认为这是因为很多连接在插入完成后仍然存在,但我不知道为什么。如果是像MySQL这样的RDBMS,那么每个连接必须在操作完成后关闭,但在MongoDB中,它不应该(我知道)。

我不知道为什么会这样,所以非常感谢请帮帮忙。

1 个答案:

答案 0 :(得分:0)

我通过从MongoDB获取数据后释放游标来解决这个问题。确保发布,或者保留连接池并使您的应用程序无法正常工作。

相关问题