我使用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中,它不应该(我知道)。
我不知道为什么会这样,所以非常感谢请帮帮忙。
答案 0 :(得分:0)
我通过从MongoDB获取数据后释放游标来解决这个问题。确保发布,或者保留连接池并使您的应用程序无法正常工作。