在Hapi路由处理程序中返回异步函数的输出

时间:2019-04-03 01:43:30

标签: javascript node.js async-await hapi

如果有人熟悉的话,我正在开发Twitch扩展程序,并从他们的示例之一开始工作。我对JS相当陌生,主要是C#背景,因此对我来说很多都是陌生的。基本上,我已经设置了一个hapi路由,希望我的节点服务器对不同的服务进行API调用,并返回一个包含来自API响应的某些数据的字符串,然后使用AJAX请求将其插入到iFrame中。我正在使用的API包装器使用了异步函数,当我在路由处理程序中调用它们时,请求似乎超时了,这与我在chrome devtools中查看请求所得出的结论不符。不确定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 :(得分:0)

您需要等待异步函数bracketQueryHandler的结果解决。这就像在路​​由处理程序中添加一个等待一样简单。

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

一些关于异步阅读的信息/等待https://medium.freecodecamp.org/how-to-master-async-await-with-this-real-world-example-19107e7558ad

使用Hapi 17及更高版本非常有必要熟悉此语法和Promise。