gpt4 book ai didi

javascript - Node : Send Response after MongoDB Document has been updated or created

转载 作者:可可西里 更新时间:2023-11-01 09:47:56 28 4
gpt4 key购买 nike

我有一个维护 MongoDB 的 nodeJS 服务器和一个发送带有 JSON 中的 buildName 变量的发布请求的客户端。

我想做的是设置一个事件监听器,当更新或创建具有与客户端发送的 buildName 匹配的字段的 mongoDB 文档时触发该事件监听器。多个客户端可以监听,如果更新或创建包含它们传入的相同 buildName 的文档,则必须通知它们。

我曾尝试使用这种方法进行轮询,我的客户端只是坐在一个 while 循环中并不断询问是否有更新,但是,我遇到了性能问题,所以我切换到事件监听器。

我尝试了几种不同的方法来设置回调,当我的客户端发送其发布请求时,每当文档更新时调用该请求,然后将更新后的 mongodb 文档作为 res.json 发送。我正在使用的模块之一是 mongoose-trigger npm 模块,它允许我为创建和更新设置事件监听器。

我还在这里寻找可能的解决方案,这让我找到了 mongoose-trigger用于获取在创建和更新时触发的事件,但仍然找不到使用此触发来触发对发布请求的响应的满意答案。

下面是创建触发事件对象的代码片段:

10 const Events = trigger(buildSchema, {
11 events: {
12 create: {
13 select: 'logFile'
14 },
15 update: {
16 select: 'logFile'
17 }
18 },
19 debug: true
20 });
21
22 module.exports = {
23 Build: mongoose.model('build', buildSchema),
24 Events: Events
25 };

上面的代码片段设置了 mongoose-trigger npm 模块,然后在我的 server.js 中,我在我的帖子路由中使用它,如下所示:

 11 const Model = require('./build');
12 mongoose.connect('mongodb://vcdep-db/builds');
13
14 app.post('/get_build', function(req, res) {
15 const buildName = req.body.buildName;
16 console.log(buildName);
17 Model.Events.on('create', data => {
18 Model.Build.findById(data._id, function(err, build) {
19 if (err) console.error(err);
20
21 console.log("Created model");
22 if (build.buildName === buildName)
23 {
24 console.log("Document got created", build.buildName);
26 res.json(build);
27 }
28
29 });
30 });
31 Model.Events.on('update', data => {
32 Model.Build.findById(data._id, function(err, build) {
33 if (err) console.error(err);
34
35 console.log("Updated model");
36 if (build.buildName === buildName)
37 {
38 console.log("Document got updated", build.buildName);
40 res.json(build);
41 }
42
43 });
44 });
45 });

上面的代码在我第一次更新或创建文档时有效,但是,当我执行相同的过程时,我得到一个错误:发送后无法设置标题。我相信这是因为在我发送 res.json(build) 之后,mongoose-trigger 设置的监听器没有被删除,所以当同一个文档再次更新时,它会尝试执行相同的 res.json 来自触发该错误的前一个客户端回调。

我研究了删除此处的事件监听器并查看 mongoose-trigger 是否允许类似的事情,但尚未找到解决方案。

我相信一旦我能够在发送响应后解除绑定(bind)触发器,它应该可以修复错误,但我可能错了。如果有人可以提供帮助,我将不胜感激!

此外,我并不是一成不变地使用 mongoose-trigger,所以如果有更好的方法来监听 mongoDB 更新或创建的此类事件,我非常愿意将其更改为其他方法。

最佳答案

您需要在其中一个被调用后立即删除您附加的回调对。为此,您不能使用任何函数,而必须改用命名函数:

app.post('/get_build', function(req, res) {
const buildName = req.body.buildName;
console.log(buildName);

function onCreate(data) {
Model.Build.findById(data._id, function(err, build) {
if (err) console.error(err);

console.log("Created model");
if (build.buildName === buildName) {
console.log("Document got created", build.buildName);

// clean up the event listeners
Model.Events.removeListener('create', onCreate);
Model.Events.removeListener('update', onUpdate);

res.json(build);
}

});
}

function onUpdate(data) {
Model.Build.findById(data._id, function(err, build) {
if (err) console.error(err);

console.log("Updated model");
if (build.buildName === buildName) {
console.log("Document got updated", build.buildName);

// clean up the event listeners
Model.Events.removeListener('create', onCreate);
Model.Events.removeListener('update', onUpdate);

res.json(build);
}

});
}

Model.Events.on('create', onCreate);
Model.Events.on('update', onUpdate);
});

但这仍然是一个糟糕的设计,更好的方法是使用 socket.io 或类似的东西。

关于javascript - Node : Send Response after MongoDB Document has been updated or created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755708/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com