无法在文档删除时触发 Mongoose Pre/Post Hook

问题描述 投票:0回答:1

我在 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 没有触发,删除文档后控制台中也没有显示任何日志。我已确保在创建模型之前注册了挂钩,但问题仍然存在。

我感谢任何有关如何解决此问题的见解或建议。谢谢!

node.js mongodb express mongoose mongoose-schema
1个回答
0
投票

你可以尝试使用.remove()函数吗

const item = await Model.findOne(<YourCondition>);
item.remove(function (err) {
  if (err) throw err;
  console.log('Item removed');
});
© www.soinside.com 2019 - 2024. All rights reserved.