node.js - 等待数据在数据库中出现/更改

标签 node.js mongodb rest redis

我正在编写 REST api,它必须提供用户之间的实时通信。假设我有 db.orders 集合。我有 api GET/order/{id}。此 api 应等待 order 文档中的某些更改。例如,它应该仅在 order.statusready 时返回一些数据。我知道如何进行长轮询,但我不知道如何检查数据库中出现/更改的数据。如果只有一个应用程序实例就会很容易 - 然后我可以在内存中执行此操作,如下所示:

var queue = []

// GET /order/{id}
function(req,res,next) {
    var data = getDataFromDb();
    if(data && data.status == 'ready') {
        res.send(data);
        return;
    }
    queue.push({id: req.params.id, req: req, res: res, next: next});
}

// POST /order/{id}
function(req,res,next) {
    req.params.data.status = 'ready'
    saveToDb(req.params.data);
    var item = findInQueue(queue,req.params.id); 
    if(item) item.res.send(req.params.data);
}

第一个处理程序等待数据的状态为 ready,第二个处理程序将数据状态设置为 ready。它只是一个伪代码,缺少很多东西(例如超时)。

问题是当我想使用此类应用程序的多个实例时 - 我需要一些消息传递机制,以允许在某种程度上实时地跨实例进行通信。

我阅读了有关 REDIS PUB/SUB 的内容,但我不确定我是否可以以这种方式使用它...

我现在使用的是 node.js + restify + mongoDB。

最佳答案

您正在寻找操作日志。它是一个特殊的上限集合,其中存储了对数据库的所有操作。要在单个服务器上启用它们,您可以这样做。

mongod --dbpath=./data --oplogSize=100 --replSet test

然后使用控制台连接到服务器并写入

rs.initiate()

使用控制台并执行

use local
show collections

注意集合 oplog.rs。它包含已应用于服务器的所有操作。如果你使用的是 node.js,你可以通过以下方式监听变化

var local = db.db("local");
var steam = local.collection("oplog.rs").find({}, {tailable:true, awaitdata:true}).stream();
stream.on('data', function(doc) {
});

对于 mongodb 上的每个操作,您都会收到一份文档,您可以在其中确定您感兴趣的内容是否已更改状态。

关于node.js - 等待数据在数据库中出现/更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190204/

相关文章:

node.js - 如何在 sails js 中确保索引

javascript对象转mongodb结构,不会冒泡

json - HTTP 中的 "406-Not Acceptable Response"是什么?

javascript - 使用 nTwitter 回复带有 node.js 的推文

node.js - 如何使用自定义域访问我自己的 ogar 服务器?

node.js - 如何自动启动 Node 服务?

mongodb - Mac OS - 由于权限问题无法使用 Homebrew 安装 mongodb

javascript - Mongoose 更新不起作用

java - 使用来自的其余 Web 服务从数据库下载文件

rest - 我应该使用 POST 还是 PUT 进行登录请求,为什么?