Возврат вывода асинхронной функции в обработчике маршрута Hapi - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над расширением Twitch, если кто-нибудь знаком и начал работать над одним из их примеров. Я довольно новичок в JS, в основном с фоном C #, поэтому многое из этого мне чуждо. По сути, я настроил маршрут хапи и хочу, чтобы мой сервер узлов выполнял вызов API для другой службы и возвращал строку, содержащую некоторые данные из ответа API, которые затем вставляются в iFrame с помощью запроса AJAX. Оболочка API, которую я использую, использует асинхронные функции, и когда я вызываю их в обработчике маршрутов, кажется, что запросы истекают из того, что я могу сказать, посмотрев запрос в devtools chrome. Не уверен, что вызовы API просто слишком длинные или что-то в этом роде? Вот ссылка на API-оболочку, которую я использую: https://www.npmjs.com/package/smashgg.js?activeTab=readme

Я подозреваю, что мне чего-то не хватает с синтаксисом async / await, я пока не совсем понимаю, как они работают. В идеале я хотел бы иметь код, который возвращает строку вывода в своем собственном методе, но для простоты я только что скопировал пример, но получаю те же результаты. Этот код отлично работает в своем собственном файле.

Вот определение маршрута:

  server.route({
    method: 'GET',
    path: '/bracket/query',
    handler: bracketQueryHandler
  });

и метод обработчика маршрута:

async function bracketQueryHandler(req){
  const payload = verifyAndDecode(req.headers.authorization);
  const { channel_id: channelId, opaque_user_id: opaqueUserId } = payload;
  const currentBracket = channelBrackets[channelId] || initialBracket;

  let tournamentSlug = 'function-1-recursion-regional';
  let eventSlug = 'melee-singles';
  let meleeAtFunction = await Event.get(tournamentSlug, eventSlug);

  let sets = await meleeAtFunction.getSets();
  let phaseGroups = await meleeAtFunction.getPhaseGroups();
  let setString = "";
  for(var i in sets){
      setString += "\n" + sets[i].getFullRoundText() + " : " + sets[i].getDisplayScore();
  }

  console.log(setString);
  return setString;
}

1 Ответ

0 голосов
/ 03 мая 2019

Вам нужно дождаться разрешения асинхронной функции BraQQueryHandler.Это должно быть так же просто, как добавить ожидание в ваш обработчик маршрута.

server.route({
  method: 'GET',
  path: '/bracket/query',
  handler: await bracketQueryHandler
});

При этом я обычно использую конструкцию, подобную ..

server.route({
  method: 'GET',
  path: '/bracket/query',
  handler: async (request, h) => { 
    return await bracketQueryHandler(request)
  }
});

Эта конструкция согласуется сDocs.https://hapijs.com/tutorials#routes

Некоторое чтение по async / await https://medium.freecodecamp.org/how-to-master-async-await-with-this-real-world-example-19107e7558ad

Ознакомление с этим синтаксисом и Promise совершенно необходимо с использованием Hapi 17 и выше.

...