Mongodb通知文件已更新

时间:2014-01-16 18:00:29

标签: node.js mongodb express websocket socket.io

想象一下,如果我有一个mongodb与一些文件和一个nodejs服务器使用socket.io从mongodb发送到客户端的json数据,并且一些进程已更新当前在客户端视图中的mongodb文档,我想知道如果有一种方法让mongodb通知nodejs服务器当对象被客户端自己以外的任何人更新,以便我可以通过打开的套接字发出更新的文件json,这样的事情可能吗?

我试图在谷歌上找到一些没有运气的资源。

3 个答案:

答案 0 :(得分:2)

假设这是一个文档架构

'use strict';

import mongoose from 'mongoose';

var MessageSchema = new mongoose.Schema({
  toid: String,
  fromid: String,
  toname: String,
  fromname: String,
  content: String,
  date: { type: Date, default: Date.now }
});

export default mongoose.model('Message', MessageSchema);

这是后端代码,您可以在其中更改文档的内容

import {Router} from 'express';
var router = new Router();
router.post('/create/:id', function(req, res){
return Message.create(req.body)
    .then(respondWithResultAndEmitAnEvent(res, 201))
    .catch(handleError(res));
}); 

所以这个 respondWithResultAndEmitAnEvent 函数看起来像这样, 顾名思义,即使用户将数据发送到服务器(例如,在url xyz.com/api/create/:id上),服务器也会发出一个可以被其他客户端捕获的事件。

function respondWithResultAndEmitAnEvent(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      socket.emit('message_added', entity);
      res.status(statusCode).json(entity);
    }
  };
}

在客户端,您可以收听此消息“message_added”并进行更新。

    socket.on('message_added', function ( data ) {
      console.log(data);
      //update the client with new data;
    }); 

答案 1 :(得分:0)

如果您控制了其他进程,那么我建议您主动执行此操作,这意味着保存的过程会触发代码,即"观看"为了改变。否则,您可以进行区间轮询,但这通常效率低下,而且通常设计不好。您还可以查看一些更有趣的方法,例如观看Mongo Oplog。

答案 2 :(得分:0)

Mongoose有一个middlawre:http://mongoosejs.com/docs/middleware.html

您可以在保存和删除记录上运行脚本。在此脚本中,您可以执行任何操作,包括通知您的通知服务器。