我正在尝试使用mongoose创建一个模型,然后再创建另一个模型并保存对原始模型的引用。我一直在查阅mongoose的中间件和钩子文档,但其中一些似乎没有被触发。
这个答案告诉我为什么我的init钩子不会触发HERE,pre和post init仅在从数据库加载预先存在的模型时才会触发。因此,我知道validate将在创建新模型时运行。因此,我从pre init切换到pre validate。
以下是我想要做的代码:
我收到了以下错误信息
这是有道理的,因为在我的模型中它希望传递一个
以下是我尝试的步骤:
1. 创建位置 2. 获取新的
我试图将这个过程添加到一个
GroupSchema.pre('validate', function (next, data) {
console.log("inside pre validate");
if (data.location) {
location = new Location(data.location);
data.location = location._id;
location.save(function (err) {
if (err) handleError(err);
});
}
next();
})
我知道因为文档还没有填充数据,所以我不能使用this
。这就是为什么我有了data
,但这似乎仍然不起作用,哦,我从这个答案中弄清楚了我应该传递哪些参数。
非常感谢您的帮助。
**************更新**************
为了更好地说明问题,根据一个答案中的建议,将我的pre
validate
函数更改为:
GroupSchema.pre('validate', function (next, data) {
console.log("inside pre validate", this);
if (this.location) {
location = new Location(this.location);
this.location = location._id;
location.save(function (err) {
if (err) handleError(err);
});
}
next();
})
我收到了以下错误信息
service err: CastError: Cast to ObjectId failed for value "[object Object]" at path "location"
这是有道理的,因为在我的模型中它希望传递一个
ObjectId
而不是我所传递的[object, Object]
。然而,我想我可以先保存location
,获取生成的ObjectId
并将其存储在组模型中,然后再抛出错误。因此最初使用了pre
init
,直到发现这样做行不通,现在发现pre
validate
也不起作用。有没有办法实现我所尝试的呢?以下是我尝试的步骤:
1. 创建位置 2. 获取新的
ObjectId
3. 将新的位置ObjectId
存储在组中而不是对象本身我试图将这个过程添加到一个
pre
挂钩中,这样我就可以把这段代码放在一个地方,当新建一个组模型时,它会自动处理这个操作。
data.location
传入new Location
调用,然后使用data.location = location._id;
进行赋值。 - JohnnyHKpre
validate
根本没有被触发。所以如果那是个问题,它并没有出现,因为它甚至没有达到那个点。 - gmaniacpre
validate
会在模型实际验证之前触发吗? - gmaniac