node.js - mongoDB + NodeJS : can't keep a stream cursor open

标签 node.js mongodb sockjs

对于日志查看器,我必须将更新写入 sockJS 套接字上的 mongoDB 集合中。

基于this post ,我使用 native NodeJS 驱动程序的流游标来执行此操作,但它仅适用于我创建流时集合中存在的内容。没有写任何进一步的更新。

这是我的代码:

var server = new mongodb.Server(config.db_host, config.db_port, {});
var DB = new mongodb.Db('myLogs', server, {w:0}).open(function (error, database) {
    if (error) throw error;
    db.logs = database.collection('logs');
});

var stream = db.logs.find({user: sID}, {sort: [['_id', 'asc']]}).stream();

stream.on('error', function (err) {
    socket.write(JSON.stringify({'action': 'log','param': 'log db streaming error'}));
});
stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});

我做错了什么?这可以吗?

最佳答案

如果您有上限集合,则可以使用 TailableCursor ,它可以满足您的需求。标准CursorStream仅返回调用 find 时匹配的结果(如您所见)。

尽管如此,在 Node.JS 中并没有大量的信息来实现这一点。 Here是指向正确方向的指针。

虽然我还没有测试过这段代码,但它应该如下所示。关键是使用上限集合并将 tailableawaitdata 选项设置为 true

var stream = db.logs.find({user: sID}, {
    tailable: true,
    awaitdata: true 
    /* other options */
}).stream();

stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});

关于node.js - mongoDB + NodeJS : can't keep a stream cursor open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257074/

相关文章:

javascript - 从回调中访问对象的属性

node.js - 页脚的内容似乎不起作用

node.js - 如何通过 Nodejs Express 应用程序调用 API 获取 png 图像

javascript - 如何在 webpack 上获取原始静态 html 文件

javascript - NodeJS 中的 Axios.all 失败并出现 404 错误

Spring Websocket,连接时出现 404 错误。应用程序未使用 Spring MVC

javascript - MongoDB:如何确保 Javascript 正在等待进程?

mongodb - 唯一索引如何真正起作用并避免冲突?

spring-boot - Spring websocket (WSS) 与 angular sockjs (HTTPS) 在安全 web socket 服务器 (tomcat) 上

node.js - 用鞋sockjs进行广播