问题标签 [mongoose-middleware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
29 浏览

express - 猫鼬代码仅在我发出 2 个 http 请求时才有效

主要目标:

在调用路由时,我要么得到一个新的,要么更新现有的 CartItem 对象。对象数量和总计在中间件中传递,因此对象总计被重新计算。

Schema 似乎在第一个请求上正确地应用了它的中间件(基于控制台日志)。

但是,如果我发出另一个 http 请求,我只会得到一个更新总数的对象。

这超出了我的理解,我将不胜感激。

架构:

控制器:

0 投票
1 回答
416 浏览

node.js - 在删除 mongodb 和 nodejs 中的相应用户之前,删除与用户相关的博客文章

当我删除用户时,我还想删除与该用户相关的所有博客文章。我使用了 MongoDB 的 pre() 中间件。当它被触发时,它只在帖子中将postedBy属性设置为null,然后MongoDB罗盘postedBy仍然存在以及userId这里是用户模式。

这是 Post 架构

这是删除路线功能

0 投票
2 回答
859 浏览

node.js - 在猫鼬中预先保存中间件

我是第一次使用预保存中间件,有点困惑。

它运行得很好,即使我没有调用 next(),我的保存方法也正在执行

情况1

但是当我这样做时,在函数参数中声明了 next 但我不调用 next() 它挂在那里并且保存方法没有被执行

案例2

但是一旦我调用 next() 它就会被执行

案例3

所以我只想知道第二种情况有什么问题。在这我只有而且只有这个预中间件。如何在函数参数中定义 next 很重要,save 方法也应该在第二种情况下执行,因为我没有任何第二个 pre 中间件。

0 投票
0 回答
25 浏览

node.js - 使用 next 和没有 next 调用 pre-middleware 的区别

我不知道用 next 和没有 next 调用中间件有什么区别

没有下一个的例子所有中间件都运行得很好没有下一个也

使用 next 似乎与调用 next 或没有 next 没有区别。那么这两者之间的主要区别是什么。

0 投票
2 回答
666 浏览

node.js - 如何检测对 MongoDB/Mongoose 中的集合所做的所有更改,包括删除?

我有一个通过猫鼬使用 MongoDB 的应用程序。在应用程序上有一个名为Notifications. 我想检测每次该集合发生变化(包括删除文档)并采取适当的措施。我在这里读到:

与 Model.remove() 一样,此函数 (Model.findOneAndDelete()、Model.deleteOne()) 不会触发 pre('remove') 或 post('remove') 挂钩。

然后我在这里读到:

更改流为您提供了一种方法来监听通过 MongoDB 数据库的所有插入更新。请注意,除非您连接到 MongoDB 副本集,否则更改流不起作用。

变更流是否将删除视为更新?如何收听数据库中的所有更改,包括删除文档?

0 投票
1 回答
223 浏览

mongoose - 当 Mongoose 中的预保存挂钩失败时,如何静默跳过保存文档?

我正在向数据库中添加一系列文档。这些文档中的每一个都在预保存挂钩中进行了验证。我希望 Mongoose 忽略保存未通过验证的特定文档而不会引发任何错误,以便可以保存通过验证的其余文档。这是一个示例代码:

0 投票
1 回答
429 浏览

node.js - 猫鼬 | 中间件 | 抛出错误时由 pre/post 挂钩执行的回滚操作

考虑下面的代码,当任何钩子中抛出错误时,如何实现事务以确保someParentDocument不会被删除并且在钩子内执行的任何操作都会回滚?

0 投票
1 回答
64 浏览

mongoose - Mongoose 中间件可以填充然后对引用数组进行排序吗?

我正在尝试通过引用文档中的值对文档中的文档引用的内部数组进行排序。我希望每次运行查询时都这样做,所以如果我可以使用查询 sort() 函数或理想的后查找中间件来执行此操作(而不是让调用 find 的代码需要在事实)。

我有一个ModSet的模式,如下所示:

类别架构如下所示(不相关的详细信息除外):

我想对ModSet进行查找查询,作为查询的一部分,它应该始终按填充的类别文档中的sortOrder对类别数组进行排序。

例如,今天我运行查找并填充查询并返回以下文档:

我想得到的是(按categories.sortOrder排序):

0 投票
1 回答
62 浏览

node.js - 在猫鼬中发布中间件不雾化操作?即使调用 next(err) 仍会创建文档

我有一个模型,我们称之为它Client,我还有另一个模型称为Accounts. 它们来自不同的集合,客户可以有许多不同的帐户。我引用客户文档中的帐户,以及从帐户文档中引用回客户。

所以我们可以看到它们相互引用。我这样做是为了在请求客户信息时轻松访问填充帐户等。

我想做的是当我创建一个新客户端时,我还想创建一个新的默认帐户并在accounts数组中引用它。我在创建新客户端以创建新帐户时尝试使用预挂钩,但是这不会account使用新创建的Account文档 _id 更新客户端数组。我试过使用 this.update()

所以 pre 钩子几乎完成了我想要它做的事情,但是我想不出一种方法来使用新创建的 Account 文档中的信息更新我新创建的 Client 文档。它创建客户文档,并创建帐户文档。它的美妙之处在于,如果我在创建帐户文档时出错,那么由于它是原子化的,因此不会创建客户端。但是,唉,没有更新的accounts数组...

因此,我尝试将其放入 post hook 中。

嘿!这行得通!...有点...我可以创建一个创建帐户文档的客户文档,然后更新客户以在其accounts数组中包含帐户_id。

但!!!我用这种方法遇到的问题是它似乎没有原子化操作。因此,如果我故意使帐户创建失败(例如通过传递一个非 ObjectID 参数),那么它next(err)在我的 http 请求中调用 which 正确返回错误消息,甚至说操作失败。但是在我的数据库中,仍然创建了客户端文档,这与它停止整个操作的 pre-hook 不同,在 post hook 中它不会“撤消”客户端的创建。

总结和解决方案

基本上我需要一种方法来更新其 pre.('save') 钩子内的全新文档,以便它将存储我在钩子内处理的任何更改的数据。

或者,如果我使用 post hook 来更新新文档,则可以通过某种方式保证操作的原子化。

我尝试过的其他事情:

在创建帐户文档后,我还尝试在 pre 钩子中使用 save() ,但这会导致循环最大化文档内存,因为它只是变得递归

我尝试在 Accounts 模型上使用预挂钩,以便它引用回 Client 模型并更新它,但这给了我两个问题。它不会更新新的客户端文档(因为它在技术上尚不可查询)并且如果帐户创建失败,它仍会创建客户端。

很抱歉这个问题很长,我感谢任何反馈或建议来解决这个问题或实现我的目标的不同方法。如果你做到了这一步,感谢阅读!

0 投票
0 回答
19 浏览

mongodb - 在模型中添加一个 pre 中间件以在 mongoose 中进行扩展

我正在使用"mongoose-extend-schema": "^1.0.0"mongoose 将基本模式添加到所有其他模式。

这是我的代码:

然后我在用户模型中使用它

我期待在保存用户时,预“保存”中间件也将执行和更新 createdBy 和 updatedBy 的字段,但它没有工作。

但是如果我在用户模型中添加中间件,比如

它显示了变化。

如何直接从 baseModel 文件运行影响 baseModel 的中间件。