«это» и «далее» в промежуточном программном обеспечении mongoose с TS не работают

#typescript #mongoose

Вопрос:

Я пытаюсь заставить промежуточное программное обеспечение работать с Typescript, но и это, и следующее, pre и post работают неправильно, я не могу понять, что я делаю неправильно.

 schema.pre("updateOne", function (this: IDepartment, next: HookNextFunction) {
  console.log("pre update department"); // <- logs: pre update department
  console.log(this.peopleCount);        // <- logs: undefined
  next();                               // throws error: next is not a function
});
 

IDepartment это интерфейс, который я создал для документа отдела.

Промежуточное программное обеспечение действительно вызывается, так как обе консоли регистрируются, но this.peopleCount регистрируются неопределенно, и когда оно доходит до next() этого, оно выдает ошибку next is not a function .

Это мой интерфейс:

 import { Document } from "mongoose";

interface IEmployeeInput {
  departmentId: string;
  employeeSkills: {
    primaryIDs: string;
    secondaryIDs: string[];
  };
  egn: string;
  firstName: string;
  lastName: string;
  middleName: string;
}

export interface IEmployee extends IEmployeeInput, Document {
  internalCompanyId: string;
  fullName: string;
  createdAt: Date;
  updatedAt: Date;
  schedule: number;
}
 

И Схема:

 import { model, models, Schema, HookNextFunction } from "mongoose";

import { IDepartment } from "~/types";

const schema = new Schema<Required<IDepartment>>({
  initials: { length: 4, type: String },
  name: { maxlength: 20, minlength: 4, required: true, type: String, unique: true },
  peopleCount: { type: Number, required: true },
});

schema.pre("updateOne", function (this: IDepartment, next: HookNextFunction) {
  console.log("pre update department");
  console.log(this.peopleCount);
  next();
});

export const DepartmentModel = models.Department || model<IDepartment>("Department", schema);
 

Ответ №1:

Существует определенная особенность в обработке промежуточных программ updateOne и deleteOne, назначаемых schema.pre вызовами:

В отличие schema.pre('remove') от , Мангуста регистрируется updateOne и deleteOne промежуточное ПО Query#updateOne() по умолчанию и Query#deleteOne() по умолчанию. Это означает, что оба doc.updateOne() и Model.updateOne() запускают updateOne крючки, но this относится к запросу, а не к документу.

Вам нужно будет изменить код регистрации промежуточного программного обеспечения, чтобы принудительно присвоить его документу:

 schema.pre('updateOne', 
  { document: true, query: false }, 
  function() { ... });