我正在使用Mongoose尝试为我的应用程序创建一个用户模型。我参考了他们的文档,并得到了以下代码。
import { NextFunction } from 'express';
import { Schema, model } from 'mongoose';
const bcrypt = require("bcrypt")
export interface IUser {
email: string
password: string
username: string
}
const UserSchema = new Schema<IUser>(
{
email: { type: String, required: true },
password: { type: String, required: true, minlength: 5, hide: true },
username: { type: String, required: true, minlength: 2 },
},
)
UserSchema.pre("save", async function(next: NextFunction) {
const user = this;
if(!user.isModified("password")){
next();
}
bcrypt.genSalt(10, (err: Error, salt: string) => {
if(err) {
return next(err);
}
bcrypt.hash(user.password, salt, (err: Error, hash: string) => {
if(err){
return next(err);
}
user.password = hash;
next();
})
})
});
UserSchema.methods.comparePassword = function (password: string, cb: Function) {
const user = this;
bcrypt.compare(password, user.password, (err: Error, isMatch: boolean) => {
if(err) {
return cb(err);
}
cb(null, isMatch);
})
}
const User = model<IUser>("User", UserSchema);
export default User
除了在保存文档时尝试插入pre
挂钩的部分之外,其他一切都很好。
No overload matches this call.
The last overload gave the following error.
Argument of type '"save"' is not assignable to parameter of type 'RegExp | "insertMany"'.ts(2769)
我不明白。我在谷歌上搜索了一段时间,无论我在哪里看到,人们都用同样的方式写钩子。我做错了什么?
我在这里找到了this post,几乎是同样的问题,但没有帮助。
1条答案
按热度按时间eni9jsuy1#
问题已经解决了,问题是我在使用
express
中的NextFunction
类型来注解回调函数中的next
参数。变化
到
解决了这个问题。我不知道正确的类型是什么,但会调查一下。尽管如此,这个问题还是解决了。