Задать вопрос
dmc1989
@dmc1989

Как отправить ошибку на клиент в koa?

На сервере все ок, вроде. Но на клиент приходит 404 вместо 403. Что я делаю не так?

Нода:
router.post('/api/auth/sign-up', async (ctx, next) => {
  const user = new UserModel({
    ['info.name']: ctx.request.body.username,
    email: ctx.request.body.email,
    password: ctx.request.body.password
  });

  user
    .save()
    .then(user => {
      ctx.body = user;
    })
    .catch(err => {
      ctx.throw(403, "Cannot create user or user is already created!");
    });

  await next();
});

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.statusCode || err.status || 500;
    ctx.body = {code: err.statusCode, message: err.message};
    ctx.app.emit('error', err, ctx);
  }
})

app.on('error', (err, ctx) => {
  console.error(err);
});

app.use(router.routes());


Реакт:
handleSubmit = e => {
  e.preventDefault();

  if (this.validateForm() === true) {
    axios
      .post('/api/auth/sign-up', {
        username: this.state.username,
        email: this.state.email,
        password: this.state.password
      })
      .then(response => {
        console.log(response);
      })
      .catch(err => {
        console.error(err);
      });
  } else {
    alert('incorrect data');
  }
}
  • Вопрос задан
  • 155 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 2
ilnuribat
@ilnuribat
типо пишу программы
1) в POST методе не нужен в конце `await next()`
в принципе, когда обрабатываете конечные пути, `next` не нужен, он нужен только для middleware, когда надо запрос пустить дальше.
2) раз начали работать с async/await - работайте только с ними, не используйте promise

try {
  await user.save()
  ctx.body = user;
} catch (err) {
  ctx.throw(403, "Cannot create user or user is already created!");
}
Ответ написан
Комментировать
rockon404
@rockon404 Куратор тега React
Frontend Developer
router.post('/api/auth/sign-up', ctx => {
  const { username, email, password } = ctx.request.body;

  const user = new UserModel({
    'info.name': username,
    email,
    password,
  });

  user
    .save()
    .then(user => {
      ctx.body = user;
    })
    .catch(err => {
      ctx.throw(403, "Cannot create user or user is already created!");
    });
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vshvydky
Вероятно проблема в том что ты не знаешь js , когда ты используешь промисы в асинк функциях результат их исполнения будет существенно позже await next... И не будет важен уже для ответа клиенту.
Ответ написан
Комментировать
dmc1989
@dmc1989 Автор вопроса
router.post('/api/auth/sign-up', async (ctx, next) => {
  const user = new UserModel({
    ['info.name']: ctx.request.body.username,
    email: ctx.request.body.email,
    password: ctx.request.body.password
  });

  await user
    .save()
    .catch(err => {
      ctx.throw(403, "Cannot create user or user is already created!");
    });

  ctx.body = user;
  await next();
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы