#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() { ... });