Машинопись Mon goose это не определено - PullRequest
0 голосов
/ 11 апреля 2020

Я создаю бэкэнд, используя 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);
    }
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...