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

Я изучаю 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]: первый аргумент должен быть одним из введите строку или буфер. Полученный тип объекта.

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

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

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

1 Ответ

0 голосов
/ 18 апреля 2019

Поскольку 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
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...