eВнутри pre('save',...
, ссылка на текущий документ находится в this
. Здесь я заменил company
на this
в вашем примере.
const schema = new mongoose.Schema({})
schema.pre('save', function (next) {
cModel.find({name: this.name}, function (err, docs) {
if (!docs.length){
next();
} else {
console.log('company name exists: ', this.name);
next(new Error("Company Name exists!"));
}
});
});
const cModel = mongoose.model("cmodel", schema)
Эта ошибка не имеет никакого отношения к лямбде, за исключением того, что среда выполнения в лямбде, похоже, поглощает ошибку в асинхронном методе. Чтобы увидеть, как выдается ошибка, вы можете обернуть содержимое вашего обратного вызова в блок try {...} catch (e) {...}
и зарегистрировать ошибку в блоке перехвата:
const schema = new mongoose.Schema({})
schema.pre('save', function (next) {
try {
cModel.find({name: this.name}, function (err, docs) {
try {
if (!docs.length){
next();
} else {
console.log('company name exists: ', this.name);
next(new Error("Company Name exists!"));
}
} catch (e) {
console.error('error in cModel.find: ' + e.message)
}
});
} catch (e) {
console.error('error in pre save : ' + e.message)
}
});
const cModel = mongoose.model("cmodel", schema)
Обновление
Использование.pre('update'...
будет иметь this
ссылку на запрос, а не на документ, так как документ никогда не загружается. Вы можете получить доступ к частям запроса, используя getFilter()
и getUpdate()
.
Ниже приведен пример проверки существования компании перед обновлением:
const schema = new mongoose.Schema({})
schema.pre('update', function (next) {
let newName = this.getUpdate().name;
cModel.find({name: newName }, function (err, docs) {
if (!docs.length){
next();
} else {
console.log('company name exists: ', newName);
next(new Error("Company Name exists!"));
}
});
});
const cModel = mongoose.model("cmodel", schema)