Заголовки уже отправлены - Koa и bcrypt

1

Я пытаюсь создать конечную точку входа для своего приложения. Я использовал bcrypt для хеширования пароля, когда пользователь создал. При входе я хочу сравнить хэш со строковым паролем. Однако, когда я вхожу в аккаунт с использованием почтового менеджера, я получаю ошибку 404, "заголовки уже отправлены". Я посмотрел на форум koa git, используя криптографию с koa 2, и принятый ответ предполагает завершение функции в async, и это то, что я сделал. Я не могу понять, почему узел продолжает отправлять мне сообщение об ошибке "заголовки уже отправлены".

var User = db.get('users');
var Review = db.get('reviews');

//this create user function works as intended...

module.exports.create = async (ctx, next) => {
  if ('POST' != ctx.method) return await next();

  let user = ctx.request.body;

  console.log('CREATE USER params:');
  console.log(user);

  console.log(user.username);
  let users = await User.find({username:user.username});
  console.log(users); //why is this a function???
  if (users.length > 0) {
    ctx.status = 400;
    ctx.body = {
      errors:[
        'Username already exists.'
      ]
    };
  } else {
    const hash = await bcrypt.hash(user.password, 10);
    await User.insert({username:user.username, password:hash});
    console.log('Creating user…');
    console.log(user);
    ctx.body = filterProps(user, ['username']);
    ctx.status = 201;
    }
  };

module.exports.signIn = async (ctx, next) => {

  const encoded = ctx.request.headers.authorization.split(' ')[1];
  const decoded = base64url.decode(encoded);
  const [username, password] = decoded.split(':');
  const user = await User.findOne({username:username});
 
  //problematic code here...

  await bcrypt.compare(password, user.password, function (err, res) {
    if (res) {
      ctx.status = 200;
      ctx.body = 'success';
    } else {
      ctx.status = 401;
      ctx.body = {
        errors:['password incorrect for this username']
      }
    }
  });
}
  • 0
    Это весь код? Есть ли что-то, что вызывает эту функцию? Ваша ошибка обычно означает, что вы отправили ответ клиенту, а вы отправили другой, который вы не можете сделать. Вы можете ответить только один раз, как правило, и в вашем сценарии.
  • 0
    Как обычно, вы можете увидеть эту проблему, когда вы уже отправили что-то для вывода. Иногда это происходит, когда одна из наших зависимостей имеет ошибку. Кроме того, проблема может быть вызвана другим промежуточным программным обеспечением. Контент может быть уже отправлен туда.
Теги:
bcrypt
koa

1 ответ

1
Лучший ответ

Поэтому проблема заключалась в том, как я использовал сравнение bcrypt. Я сохранил результат в переменной вместо использования обратного вызова, и он сработал. Почему, я не знаю...

module.exports.signIn = async (ctx, next) => {
  const encoded = ctx.request.headers.authorization.split(' ')[1];
  const decoded = base64url.decode(encoded);
  const [username, password] = decoded.split(':');
  const user = await User.findOne({username:username});
  
  const correct = await bcrypt.compare(password, user.password)
  if (correct) {
    ctx.status = 200;
    ctx.body = 'success';
  }
  else {
    ctx.status = 401;
    ctx.body = {
      errors:['wrong credentials']
    }
  }
};
  • 2
    Если передать функцию обратного вызова, bcrypt.compare возвращает undefined вместо обещания, и поэтому await не в конечном итоге ничего ждать. Затем к тому времени, когда происходит обратный вызов, ответ уже сделан ... К сожалению, await undefined действительно в JavaScript = /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню