Mongoose .pre('save') 不触发
Mongoose .pre('save') does not trigger
我有以下 mongoose.model('quotes')
模型:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var quotesSchema = new Schema({
created: { type: String, default: moment().format() },
type: { type: Number, default: 0 },
number: { type: Number, required: true },
title: { type: String, required: true, trim: true},
background: { type: String, required: true },
points: { type: Number, default: 1 },
status: { type: Number, default: 0 },
owner: { type: String, default: "anon" }
});
var settingsSchema = new Schema({
nextQuoteNumber: { type: Number, default: 1 }
});
// Save Setting Model earlier to use it below
mongoose.model('settings', settingsSchema);
var Setting = mongoose.model('settings');
quotesSchema.pre('save', true, function(next) {
Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
if (err) { console.log(err) };
this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
next();
});
});
mongoose.model('quotes', quotesSchema);
mongoose.model('settings')
有一个附加架构,用于存储我试图建立的递增唯一索引 Quote.number
的递增数字。在每次保存之前,调用 quotesSchema.pre('save')
来读取、增加 nextQuoteNumber
并将其作为 this.number
传递给相应的 next()
函数。
但是,在别处保存 Quote
时,似乎不会触发整个 .pre('save')
功能。 Mongoose 中止保存,因为 number
是必需的但未定义并且我写入函数的 console.log()
没有输出任何内容。
使用 pre('validate')
而不是 pre('save')
来设置必填字段的值。 Mongoose 在保存之前验证文档,因此如果存在验证错误,您的 save
中间件将不会被调用。将中间件从 save
切换到 validate
将使您的函数在验证之前设置数字字段。
quotesSchema.pre('validate', true, function(next) {
Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
if (err) { console.log(err) };
this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
next();
});
});
我 运行 遇到了 pre('validate') 没有帮助的情况,因此我使用了 pre('save')。我读到一些操作是直接在数据库上执行的,因此不会调用 mongoose 中间件。我更改了将触发 .pre('save') 的路由端点。我使用 Lodash 来解析主体并仅更新传递给服务器的字段。
router.post("/", async function(req, res, next){
try{
const body = req.body;
const doc = await MyModel.findById(body._id);
_.forEach(body, function(value, key) {
doc[key] = value;
});
doc.save().then( doc => {
res.status(200);
res.send(doc);
res.end();
});
}catch (err) {
res.status(500);
res.send({error: err.message});
res.end();
}
});
在某些情况下我们可以使用
UserSchema.pre<User>(/^(updateOne|save|findOneAndUpdate)/, function (next) {
但我在函数内部使用“this”来获取数据,但不适用于 findOneAndUpdate 触发器
我需要使用
async update (id: string, doc: Partial<UserProps>): Promise<User | null> {
const result = await this.userModel.findById(id)
Object.assign(result, doc)
await result?.save()
return result
}
而不是
async update (id: string, doc: Partial<UserProps>): Promise<User | null> {
const result = await this.userModel.findByIdAndUpdate(id, doc, { new: true, useFindAndModify: false })
return result
}
对于被 Google 重定向到这里的人,请确保您在 methods
和钩子声明之后调用 mongoose.model()
。
我有以下 mongoose.model('quotes')
模型:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var quotesSchema = new Schema({
created: { type: String, default: moment().format() },
type: { type: Number, default: 0 },
number: { type: Number, required: true },
title: { type: String, required: true, trim: true},
background: { type: String, required: true },
points: { type: Number, default: 1 },
status: { type: Number, default: 0 },
owner: { type: String, default: "anon" }
});
var settingsSchema = new Schema({
nextQuoteNumber: { type: Number, default: 1 }
});
// Save Setting Model earlier to use it below
mongoose.model('settings', settingsSchema);
var Setting = mongoose.model('settings');
quotesSchema.pre('save', true, function(next) {
Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
if (err) { console.log(err) };
this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
next();
});
});
mongoose.model('quotes', quotesSchema);
mongoose.model('settings')
有一个附加架构,用于存储我试图建立的递增唯一索引 Quote.number
的递增数字。在每次保存之前,调用 quotesSchema.pre('save')
来读取、增加 nextQuoteNumber
并将其作为 this.number
传递给相应的 next()
函数。
但是,在别处保存 Quote
时,似乎不会触发整个 .pre('save')
功能。 Mongoose 中止保存,因为 number
是必需的但未定义并且我写入函数的 console.log()
没有输出任何内容。
使用 pre('validate')
而不是 pre('save')
来设置必填字段的值。 Mongoose 在保存之前验证文档,因此如果存在验证错误,您的 save
中间件将不会被调用。将中间件从 save
切换到 validate
将使您的函数在验证之前设置数字字段。
quotesSchema.pre('validate', true, function(next) {
Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
if (err) { console.log(err) };
this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
next();
});
});
我 运行 遇到了 pre('validate') 没有帮助的情况,因此我使用了 pre('save')。我读到一些操作是直接在数据库上执行的,因此不会调用 mongoose 中间件。我更改了将触发 .pre('save') 的路由端点。我使用 Lodash 来解析主体并仅更新传递给服务器的字段。
router.post("/", async function(req, res, next){
try{
const body = req.body;
const doc = await MyModel.findById(body._id);
_.forEach(body, function(value, key) {
doc[key] = value;
});
doc.save().then( doc => {
res.status(200);
res.send(doc);
res.end();
});
}catch (err) {
res.status(500);
res.send({error: err.message});
res.end();
}
});
在某些情况下我们可以使用
UserSchema.pre<User>(/^(updateOne|save|findOneAndUpdate)/, function (next) {
但我在函数内部使用“this”来获取数据,但不适用于 findOneAndUpdate 触发器
我需要使用
async update (id: string, doc: Partial<UserProps>): Promise<User | null> {
const result = await this.userModel.findById(id)
Object.assign(result, doc)
await result?.save()
return result
}
而不是
async update (id: string, doc: Partial<UserProps>): Promise<User | null> {
const result = await this.userModel.findByIdAndUpdate(id, doc, { new: true, useFindAndModify: false })
return result
}
对于被 Google 重定向到这里的人,请确保您在 methods
和钩子声明之后调用 mongoose.model()
。