Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 等待数据显示/更改(以DB为单位)_Node.js_Mongodb_Rest_Redis - Fatal编程技术网

Node.js 等待数据显示/更改(以DB为单位)

Node.js 等待数据显示/更改(以DB为单位),node.js,mongodb,rest,redis,Node.js,Mongodb,Rest,Redis,我正在编写RESTAPI,它必须提供用户之间的实时通信。假设我有db.orderscollection。我有apiGET/order/{id}。此api应等待顺序文档中的某些更改。例如,它应该仅在order.status为ready时返回一些数据。我知道如何进行长时间轮询,但我不知道如何检查数据库中的数据是否显示/更改。如果有一个应用程序实例,这将很容易-然后我可以在内存中执行此操作,类似这样: var queue = [] // GET /order/{id} function(req,re

我正在编写RESTAPI,它必须提供用户之间的实时通信。假设我有
db.orders
collection。我有api
GET/order/{id}
。此api应等待
顺序
文档中的某些更改。例如,它应该仅在
order.status
ready
时返回一些数据。我知道如何进行长时间轮询,但我不知道如何检查数据库中的数据是否显示/更改。如果有一个应用程序实例,这将很容易-然后我可以在内存中执行此操作,类似这样:

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。

您正在寻找oplog。它是一个特殊的capped集合,存储数据库上的所有操作。要在单个服务器上启用它们,可以执行以下操作

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上的每个操作,您都会收到一份文档,可以在其中确定您是否对更改状态感兴趣。

非常感谢,这似乎是我想要的,但它是否有效?您觉得将redis与pub/sub结合使用怎么样?我已经用redis实现了原型,它似乎可以工作,但我还不知道它的性能。。。