想象一下,如果我有一个mongodb与一些文件和一个nodejs服务器使用socket.io从mongodb发送到客户端的json数据,并且一些进程已更新当前在客户端视图中的mongodb文档,我想知道如果有一种方法让mongodb通知nodejs服务器当对象被客户端自己以外的任何人更新,以便我可以通过打开的套接字发出更新的文件json,这样的事情可能吗?
我试图在谷歌上找到一些没有运气的资源。
答案 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
您可以在保存和删除记录上运行脚本。在此脚本中,您可以执行任何操作,包括通知您的通知服务器。