gpt4 book ai didi

javascript - 从预保存 Hook 中调用架构方法并更新属性

转载 作者:行者123 更新时间:2023-11-28 05:19:22 24 4
gpt4 key购买 nike

我想从预保存 Hook 中调用一个函数,该函数更新正在保存/更新的实例中的属性。我不想在模式方法内再次调用 save() 。

此外,下面只是一个示例,但我有一些相当长的 shema 方法,我不想将它们包含在预保存 Hook 中。

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;
}
}

一旦函数返回,更改似乎不会永久生效。

谢谢。

最佳答案

除了示例代码中的拼写错误之外,我唯一的猜测是 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();
}
}

注意:如果您要修改实例值,我建议您在预验证步骤中执行此操作,以便模型可以在保存之前验证修改后的值。

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;
}
}

关于javascript - 从预保存 Hook 中调用架构方法并更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40690544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com