【发布时间】:2017-03-08 05:20:55
【问题描述】:
我正在尝试创建一个模型,然后创建另一个模型并使用 mongoose 保存对原始模型的引用。我一直在查看 mongoose 关于中间件及其钩子的文档,但其中一些似乎没有触发。
这个答案告诉我为什么我的初始化钩子不会触发 HERE、pre 和 post init 只有在从数据库加载预先存在的模型时才会触发。所以我读到validate 将在创建新模型时运行。知道我从preinit切换到prevalidate。
这是我正在尝试做的代码:
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,但这似乎仍然不起作用,哦,我得到了我应该从这个answer 传递的参数。
任何帮助将不胜感激。
**************更新**************
为了增加清晰度,使用答案中推荐的内容并将我的 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 也不起作用。有什么办法可以做我正在尝试的事情吗?
这是我正在尝试的顺序:
- 创建位置
- 获取新的
ObjectId - 将新位置
ObjectId存储在组中,而不是对象本身
我试图将其添加到 pre 挂钩的原因是,我可以将这段代码放在一个位置,并且在更新组模型时它会自动处理这个问题。
【问题讨论】:
-
location: [{ type: ObjectId, ref: 'Location' }],这是对另一个集合的引用 -
嗯...它是一个数组与您将
data.location传递给new Location调用然后使用data.location = location._id;分配它的代码并不匹配。 -
我明白你在说什么,我正在把应该是一个数组的东西变成一个变量。但是,这不是我遇到的问题。
prevalidate根本没有被解雇。因此,如果这是一个问题,它就不会出现,因为它甚至还没有达到这一点。 -
其实我觉得正好相反。因为
location不是正确的类型,所以验证在进行自定义验证之前就失败了。 -
prevalidate在模型实际验证之前不会触发吗?
标签: mongoose