Возвращает выходные данные асинхронной функции в обработчике маршрута Hapi

#javascript #node.js #async-await #hapi

#javascript #node.js #async-ожидание #hapi

Вопрос:

Я работаю над расширением Twitch, если кто-нибудь знаком, и начал отрабатывать один из их примеров. Я довольно новичок в JS, в основном знаком с C #, поэтому многое из этого для меня немного чуждо. В принципе, я настроил маршрут hapi и хочу, чтобы мой сервер узла выполнял вызов 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:

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

 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)
  }
});
  

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

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

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

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

1. handler: await bracketQueryHandler будет ожидать функцию один раз (не вызовы функции) и бесполезен.