Я создаю бэкэнд, используя Node и Mon goose с Typescript. Я пытаюсь реализовать метод сравнения паролей, однако получаю, что этот пароль (который должен ссылаться на UsersSchema) не определен.
Моя модель:
const UserSchema: mongoose.Schema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
validate: {
validator: async function(email) {
const user = await this.constructor.findOne({ email });
if (user) {
if (this.id === user.id) {
return true;
}
return false;
}
return true;
},
message: _props => 'The specified email address is already in use.',
},
required: [true, 'User email required'],
},
password: { type: String, required: true },
role: { type: String, required: true },
});
UserSchema.methods.comparePassword = function(password: string): boolean {
console.log(this.password, 'this.passwor'); //THIS IS UNDEFINED
if (bcrypt.compareSync(password, this.password)) return true;
return false;
};
В моем контроллере
export const login = async (
req: express.Request,
res: express.Response,
_next: express.NextFunction,
) => {
if (req.body.email && req.body.password) {
const { email, password } = req.body;
const user = await UserSchema.findOne({ email });
// Respond with token
if (user) {
const testCompare = user.schema.methods.comparePassword(password);
console.log(testCompare, 'sskskks');
}
}
}
Метод comparePassword
вызывается правильно, но this.password остается неопределенным. Я уже пытался использовать bcrypt.compare
вместо compareSync
, используя обратные вызовы вместо async / await в контроллере, но ничего не работает!
Я обнаружил, что у других людей возникла похожая проблема, но, похоже, ни один из ответов не решил ее.
РЕДАКТИРОВАТЬ **** Хорошо, после копания я нашел ответ сам. Вместо этого я использую bcrypt.compare
и связываю ключевое слово this перед объявлением функции, чтобы оно работало.
UserSchema.methods.isCorrectPassword = function(password, callback) {
const doc = this;
bcrypt.compare(password, doc.password, function(err, same) {
if (err) {
callback(err);
} else {
callback(err, same);
}
});
};