【发布时间】:2020-07-09 14:30:00
【问题描述】:
我正在使用以下应该具有回调输入的函数: https://mongoosejs.com/docs/api.html#model_Model.findOneAndRemove
我有以下 Mutation 对象,该对象应该从数据库中删除特定药物,然后从包含该 ID 的所有 Day 条目的数组中删除其 MedicineId 的所有实例。
deleteMedicine: {
type: MedicineType,
args: {
id: { type: new GraphQLNonNull(GraphQLID) }
},
async resolve (parent, args) {
let res = Medicine.findOneAndRemove({ _id: args.id }, async (err, doc) => {
if (err === null && doc === null || doc === null) {
return;
} else if (err) {
console.error(err);
return;
} else {
return await Promise.all(doc.dayNames.map(dayName => {
return DayOfWeek.findByIdAndUpdate(dayName, { $pull: { medicineIds: doc._id }})
.catch((error1) => console.error(error1));
})).catch((error2) => console.error(error2));
}
});
await res;
return res;
}
}
findOneAndRemove 成功删除 Medicine 集合中具有 args.id 的文档,但是当它调用回调函数时,有时会将 null 传递给 doc,因此回调函数无法始终正确执行。
即使我发现了所有错误,我也会收到未处理的错误警告。 \
根据这篇文章,当 err 和 doc 都为空时,我添加了处理逻辑: https://github.com/Automattic/mongoose/issues/5022
【问题讨论】:
-
你找到解决办法了吗?我对
findByIdAndDelete()也有同样的问题。文档已从数据库中删除,但回调在文档中返回 null。
标签: javascript node.js async-await graphql-js