Проблема с возвратом из api с помощью axios

Я пытаюсь получить токен с помощью jsonwebtoken из моего api в мой реагирующий компонент, но я не могу получить его со стороны клиента, однако я думаю, что все на стороне сервера кажется нормальным.

API:

router.post("/api/user/login", async (ctx, next) => {
  var nickname = ctx.request.body.data.nickname;
  var password = ctx.request.body.data.password;
  var user = await db.collection("tmp_users").find({nickname: nickname}).toArray();
  var token = "";

  if (user.length > 0) {
    const hashPassword = user[0].password;
    bcrypt.compare(password, hashPassword)
    .then((res) => {
      if (res) {
        jwt.sign({ user: user}, "test", (err, res) => {
          console.info("token GOOD => ", res);
          ctx.body = res;
          return res;
        });
      }
    });
  }
  console.info("token FAILED => ", token);
  ctx.body = token;
  return token;
});

а вот часть клиентской части с аксиомами:

axios.post("/api/user/login", { data })
.then(res => {
  console.info("res =>", res);
  console.info("res data =>", res.data);
  console.info("res token => ", res.token);
  console.info("res data token =>", res.data.token);
});

вопрос: где найти токен? на стороне сервера консоль журнала в порядке. но на стороне клиента я потерялся, я не могу его найти.

Может я чего-то не понял? Спасибо за помощь !

Не похоже, что вы когда-либо возвращали что-либо на стороне сервера. Какой фреймворк вы используете на стороне сервера?

skellertor 24.12.2018 07:10

да, извини, но даже если я вернусь, я ничего не получу

jim2k 24.12.2018 07:15

просто верни обещание

Agney 24.12.2018 07:20

Я использую koa, когда вы хотите вернуть, вы используете «ctx.body = value», это эквивалентно «res.json ()» с экспресс

jim2k 24.12.2018 07:22

Пробую "вернуть разрешение" тоже не работает ...

jim2k 24.12.2018 07:23

это обратный вызов, который вызывает у вас проблемы. Ваша функция возвращается до того, как токен станет доступен для добавления в ответ

skellertor 24.12.2018 08:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
6
140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он не возвращает никакого значения, потому что вы возвращаете внутри обещания, которое является асинхронным. Я написал альтернативный подход, который библиотеки (bcrypt / jwt) предоставляют для синхронной работы.

router.post("/api/user/login", async (ctx, next) => {
  var nickname = ctx.request.body.data.nickname;
  var password = ctx.request.body.data.password;
  var user = await db.collection("tmp_users").find({nickname: nickname}).toArray();
  var token = "";
  if (user.length > 0) {
    const hashPassword = user[0].password;
    const res = await bcrypt.compare(password, hashPassword);
    if (res) {
      const jwttoken = await jwt.sign({ user: user}, "test")
      console.info("token GOOD => ", jwttoken);
      ctx.body = jwttoken;
      return jwttoken;
    }
  }
  return new Error("Error");
});

Я бы просто предостерегал. Не одобряется выполнение любой синхронной работы в среде узлового типа. bcrypt.compareSync - это функция блокировки. Вместо этого замените его асинхронной альтернативой, такой как const res = await bcrypt.compare(password, hashPassword);. Вот ссылка на проблему блокировки nodejs.org/en/docs/guides/blocking-vs-non-blocking.

skellertor 24.12.2018 08:39

Спасибо @skellertor за предложение. Я его обновил.

Vikramaditya 24.12.2018 09:15

Другие вопросы по теме