typescript 无法将“保存”类型的参数赋给“RegExp”类型的参数|“插入多个”. ts(2769)

egdjgwm8  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(209)

我正在使用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,几乎是同样的问题,但没有帮助。

eni9jsuy

eni9jsuy1#

问题已经解决了,问题是我在使用express中的NextFunction类型来注解回调函数中的next参数。
变化

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.pre('save', async function(next) {
    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();
        })
    })
});

解决了这个问题。我不知道正确的类型是什么,但会调查一下。尽管如此,这个问题还是解决了。

相关问题