我已经使用以下内容定义了用户模式:
import mongoose from 'mongoose'
import { Model, Schema } from 'mongoose'
import bcrypt from 'bcrypt'
enum LoginType {
EMAIL = 'email',
GOOGLE = 'google',
}
interface IUser extends mongoose.Document {
username: string
email: string
password: string
loginTypes: LoginType
comparePassword(password: string, callback: Function): Promise<Function>
}
interface IUserMethods extends Model<IUser> {
comparePassword(password: string, callback: Function): Promise<Function>
}
type UserModel = Model<IUser, {}, IUserMethods>;
const userSchema = new Schema<IUser, UserModel, IUserMethods>({
username: {
type: String,
required: true,
},
email: {
type: String,
required: true,
},
password: {
type: String,
require: true,
},
loginTypes: {
type: String,
require: true,
enum: Object.values(LoginType),
},
})
/* callback = (err: Error, isMatch: any) => {} */
userSchema.methods.comparePassword = async function (
password: string,
callback: Function
): Promise<Function> {
let result
try {
result = await bcrypt.compare(password, this.password)
return callback(null, result)
} catch (err) {
return callback(err, result)
}
}
export default mongoose.model<IUser>('User', userSchema)
并在登录路径中调用它,但TypeScrip在foundUser.comparePassword(req.body.password, (err: Error, isMatch: any) => {})
上显示错误Property 'comparePassword' does not exist on type '() => Promise<(Document<unknown, {}, IUser> & Omit<IUser & { _id: ObjectId; }, never>) | null>'.
以下是我的登录路由:
router.post('/credentials', (req, res) => {
/* Check if user exists in database */
const foundUser = async () => await User.findOne({ email: req.body.email })
if (!foundUser) {
res.status(401).send({ message: 'User does not exist' })
}
/* Check if password matches */
foundUser.comparePassword(req.body.password, (err: Error, isMatch: any) => {})
const jwt_token = jwt.sign(
{ name: req.body.name, email: req.body.email, id: req.body.id },
JWT_SECRET,
{ expiresIn: '10000' }
)
res.status(200).send({
name: req.body.name,
email: req.body.email,
id: req.body.id,
jwt_token: jwt_token,
})
})
I've search for it and try this solution before but not working.
While, I found
const a = new User({})
a.comparePassword(req.body.password, (err: Error, isMatch: any) => {})
就像mongoose doctor 说的那样,我可以正常工作,但如果我先用findOne
再拨打comparePassword
,那就不行了