我在 Mongoose 中实现用于文档删除的 pre 和 post hooks 时遇到困难。我尝试了各种方法,包括使用
deleteOne
、deleteMany
、findOneAndDelete
和 findOneAndRemove
。我还探索了其他替代方案,例如修改deleteOne中间件代码以首先找到文档,然后使用doc.deleteOne()
,但无济于事。
以下是我的实施细节:
猫鼬架构:
import { Schema, Types } from "mongoose";
export interface IUploadedImage {
_id?: Types.ObjectId;
thumbnail?: string;
medium?: string;
large?: string;
original: string;
}
const schema = new Schema<IUploadedImage>({
_id: Schema.Types.ObjectId,
thumbnail: String,
medium: String,
large: String,
original: { type: String, required: true },
});
export const uploadedImageSchema = schema;
挂钩:
schema.pre("deleteMany", async function () {
console.log("Doc will be deleted soon");
});
schema.pre("deleteOne", async function () {
console.log("Doc will be deleted soon");
});
schema.pre("findOneAndDelete", async function () {
console.log("Doc will be deleted soon");
});
schema.pre("findOneAndRemove", async function () {
console.log("Doc will be deleted soon");
});
删除代码:
import * as middleware from '../../_shared/middleware';
const middlewareOptions: CrudActionOptions = {
modelName: 'Church',
paramId: 'churchId',
ignoreChurchId: true,
passToNext: false,
permissionsPath: 'church',
};
router.delete('/:churchId', middleware.crud.deleteOne({ ...middlewareOptions }));
删除中间件代码:
export function deleteOne(options: CrudActionOptions) {
const Model = getModel(options.modelName);
return async (req: Request, res: Response, next: NextFunction) => {
try {
const hasPermissions = validatePermissions(options, res, ['delete']);
if (!hasPermissions) return next(new Error('NoPermission'));
const deletedItem = await Model.findOneAndDelete(getQueryConditions(req, res, options));
if (!deletedItem) return res.status(404).json({ message: 'Item not found' });
if (options.assignTo) {
res.locals[options.assignTo] = deletedItem;
if (options.passToNext) {
return next();
}
}
res.status(204).send();
} catch (error) {
next(error);
}
};
}
尽管我做出了努力,但 pre hooks 没有触发,删除文档后控制台中也没有显示任何日志。我已确保在创建模型之前注册了挂钩,但问题仍然存在。
我感谢任何有关如何解决此问题的见解或建议。谢谢!
你可以尝试使用.remove()函数吗
const item = await Model.findOne(<YourCondition>);
item.remove(function (err) {
if (err) throw err;
console.log('Item removed');
});