Попытка подписать jwt возвращает неопределенный результат

#javascript #node.js #express #jwt

#javascript #node.js #выразить #jwt

Вопрос:

Я изучаю node и переношу свой текущий API с python. Я пытаюсь создать токен jwt для аутентификации в стороннем API, однако моя функция возвращает undefined . Метод jwt, который я использую для подписи токена, таков async , поэтому я предполагаю, что моя функция не ждет, пока jwt вернет токен.

Это моя функция для подписи и создания токена jwt:

 function token() {
  const payload = {
    iat: Math.floor(new Date() / 1000),
    exp: Math.floor(new Date() / 1000)   30,
    sub: "api_key_jwt",
    iss: "external",
    jti: crypto.randomBytes(6).toString("hex")
  };
  return jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(
    err,
    token2
  ) {
    return token2;
  });
}
 

Итак, когда я вызываю его:

 exports.genToken = function() {
  const header = {
    "x-api-key": api
  };
  const data = {
    kid: api,
    jwt_token: token()
  };

  async function authorization(req, res) {
    try {
      const auth = await rp({
        url: authurl,
        method: "POST",
        headers: header,
        body: data
      });
      res.send(auth.body);
    } catch (error) {
      res.send(404).send();
    }
  }

  return {
    "x-api-key": api,
    Authorization: "Bearer "   authorization()
  };
};
 

jwt_token ВОЗВРАТ undefined . Что я делаю не так, и как я могу это исправить?

Заранее спасибо, ребята!

Редактировать: console.log(token2) возвращает подписанный токен. Итак, проблема заключается в возврате токена из token() функции

Комментарии:

1. Можете ли вы утешить. зарегистрируйте переменную err в функции обратного вызова и опубликуйте ее результаты? Содержит ли он ошибку?

2. Привет, Джордж, я отредактировал вопрос. На самом деле токен подписывается jwt.sign , однако он не возвращается к token() функции

Ответ №1:

Вы пытаетесь вернуться из a callback , который не работает. Измените свою функцию токена на return Promise , тогда вы можете использовать async/await подобное:

 function token() {
  ...

  return new Promise((resolve, reject) => {
    jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(err, token2) {
      if (err) reject(err);
      else resolve(token2)
    });
  })
}

// note async
exports.genToken = async function() {
  ...
  const data = {
    kid: api,
    jwt_token: await token()
  };
  ...
}

 

Комментарии:

1. Дополнение к этому правильному ответу: в javascript существуют разные реализации асинхронных задач. В вашем случае библиотека jwt не возвращает обещание, поэтому вам нужно создать свое собственное обещание, чтобы использовать его в вашем подходе async / await. P.S: Вы также можете использовать функцию обратного вызова в своем токене и добиться того же.

2. Отлично! Это было так. Я все еще немного путаюсь async/await . Большое спасибо!

3. Stackoverflow заставляет меня ждать 15 минут, прежде чем я смогу принять ответ 🙂