我想从我的预保存挂钩中调用一个函数来更新正在保存/更新的实例中的属性。我不想在架构方法中再次调用save()。
另外,下面只是一个例子,但我有一些shema方法需要很长时间,而且我不想将它们包含在预保存挂钩中。
UserSchema.pre('save', function(next) {
const user = this;
...
if (user.isModified('something')) {
user.checkSomething();
}
...
next();
});
UserSchema.method.checkSomething() = function() {
const user = this;
if(user.something > 5) {
// Any way to update the below property without calling save() again?
user.somethingElse = true;
}
}
一旦函数返回,似乎变化不是永久性的。
谢谢。
答案 0 :(得分:0)
除了示例代码中的拼写错误之外,我唯一的猜测是checkSomething
函数具有异步操作,pre-save
中间件同步运行。
// include `done` for async operation
UserSchema.pre('save', function(next, done) {
const user = this;
next();
if (user.isModified('something')) {
// Assuming this is asynchronous
user.checkSomething(done);
} else {
done();
}
});
UserSchema.method('checkSomething', checkSomething);
// Async function
function checkSomething(cb) {
const user = this;
if (user.something > 5) {
doSomethingAsync(function(err, res) {
if (err) {
return cb(err);
}
user.somethingElse = res;
cb();
});
} else {
cb();
}
}
注意:如果您要修改实例值,我建议您在pre-validate
步骤中执行此操作,以便模型可以在保存之前验证修改后的值。
UserSchema.pre('validate', function(next) {
const user = this;
if (user.isModified('something')) {
// Assuming this is synchronous
user.checkSomething();
}
next();
});
UserSchema.method('checkSomething', checkSomething);
function checkSomething() {
const user = this;
if (user.something > 5) {
user.somethingElse = true;
}
}