【发布时间】:2018-09-20 23:08:15
【问题描述】:
我想创建“游戏”,每个游戏都有自己独特的访问“代码”。架构中的代码是required,每次创建新游戏时我都需要生成一个代码。
我认为schema.pre('init') 将是生成此访问代码的好地方:
GameSchema.pre('init', function(next) {
// Code generation logic happens here
this.code = myNewlyGeneratedCode
next()
}
不幸的是,这会返回一条错误消息:ValidationError: Game validation failed: code: Path 'code' is required.
为什么这不起作用?在我实例化一个新游戏之前,我是否必须创建一个code?
【问题讨论】:
-
"init" 事件在您检索文档时被调用。你需要
.pre('save')。 -
我避免使用
.pre('save'),因为我不想每次保存对游戏文档的更改时都重新生成游戏代码。正如我在下面的评论中提到的,我认为.pre('validate')是我正在寻找的。span> -
"validate" 也会在每次对文档进行更改时调用,因此您无法避免该问题。
-
啊,是的,好点。我想我需要在
pre-save中使用this.isNew,如下面的lineus 所建议。只是感觉猫鼬应该对这种东西有更好的支持;看起来会很常见。 -
经过进一步测试,我发现我无法使用
pre-save,因为MongoDB仍然抱怨code路径是必需的。我最终在pre-validate中使用this.isNew来完成工作。
标签: node.js mongoose mongoose-schema