Использование запроса-обещания для вызова API с помощью jwt. [ERR_INVALID_ARG_TYPE] получено

Я изучаю nodejs и пытаюсь сделать вызов API. API использует 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 new Promise((resolve, reject) => {
    jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(
      err,
      token2
    ) {
      if (err) reject(err);
      else resolve(token2);
    });
  });
}

exports.genToken = async function() {
  const header = {
    "x-api-key": api
  };
  const data = {
    kid: api,
    jwt_token: await 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()
  };
};

Это прекрасно работает. Затем я создал функцию для вызова API:

const token = require("./index").genToken;
const rp = require("request-promise");

exports.getOrderBook = function(res, error) {
  const full_url = url + "order_book";
  const auth = token();

  rp({
    url: full_url,
    method: "GET",
    headers: auth,
    body: {
      market: "btceur"
    },
    json: true
  })
    .then(function(response) {
      res(response);
    })
    .catch(function(err) {
      error(err);
    });
};

И я называю это с помощью Express:

routes.get("/orderbook", async (req, res, next) => {
  try {
    const book = await orders.getOrderBook();
    res.send(book);
  } catch (error) {
    next(error);
  }
});

Однако, когда я вызываю свой API, он показывает ошибку в консоли:

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. Received type object.

Я предполагаю, что ошибка связана с генерацией токена, потому что, если я console.info(auth) в функции getOrderBook, он показывает Promise { <pending> }, поэтому, вероятно, объект передается как токен jwt.

Это действительно проблема? Я пробовал много разных решений, которые нашел в Интернете, однако концепция Async/Await для меня нова, и у меня возникли некоторые проблемы, чтобы понять ее.

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
926
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку getToken — это функция anync, возврат также заключен в Promise, поэтому вам понадобится еще один anync/await:

exports.getOrderBook = async function() {
  let response;
  try {
    const full_url = url + "order_book";
    const auth = await token();

    response = await rp({
      url: full_url,
      method: "GET",
      headers: auth,
      body: {
        market: "btceur"
      },
      json: true
    });
  } catch (e) {
    // handle error
    throw e
    // or console.error(e)
  }
  return response;
};

В этой строке также Authorization: "Bearer " + authorization(), authorization возвращает обещание

const bearer = await authorization()

return {
  "x-api-key": api,
  Authorization: "Bearer " + bearer
};

Для обработки ошибок оберните все это в блок try..catch

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

    async function authorization(req, res) {
      let auth;
      try {
        auth = await rp({
          url: authurl,
          method: "POST",
          headers: header,
          body: data
        });
        // res object not available
        // res.send(auth.body);
      } catch (error) {
        // res object not available, better throw error and handle in your middleware
        // res.send(404).send();
      }
      return auth
    }

    const bearer = await authorization()
    } catch (e) {
      // handle error
    }
  return {
    "x-api-key": api,
    Authorization: "Bearer " + bearer
  };
}

Я пробовал это, прежде чем задавать вопрос, однако я все еще получаю ту же ошибку

Otavio Bonder 18.04.2019 18:47

можешь вставить трассировку стека

1565986223 18.04.2019 19:03

Я внес некоторые изменения в код. Теперь я больше не получаю эту ошибку, однако мой токен auth вложен в JSON. Когда я пытаюсь выполнить console.info авторизацию, я получаю следующее: { 'x-api-key': 'xxxxxxxxx', Authorization: 'Bearer [object Object]' } Итак, я думаю, проблема в том, как я обрабатываю ответ из функции genToken

Otavio Bonder 18.04.2019 19:10

вы должны извлечь в этом случае

1565986223 18.04.2019 19:15

auth["токен"] решил проблему! Еще раз спасибо за помощь. Поскольку я извлек и скорректировал код на основе вашего ответа, я отмечу его как решение. Спасибо!

Otavio Bonder 18.04.2019 19:25

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