用于Firebase性能的云端函数

我正在使用Firebase的云端function来:

  1. 从api.ai接收参数
  2. 拨打第三方API和
  3. 回复api.ai.

我对第三方API的调用使用请求Node.js模块 ,并被包装在index.js中的一个函数( getInfoFromApi() )中。

我遇到的问题是次要函数调用的执行持续15-20秒。 注意:云端function本身在400毫秒范围内一直完成其执行。

通过简单的注释logging到控制台,我可以看到函数何时启动,何时调用了第二个函数,以及何时从第三方接收到响应,所以我想我可以看到发生了什么。

大致上,时间看起来像这样:

  • 0:云端function初始化
  • 400毫秒:云function完成
  • 16 s: getInfoFromApi()函数被调用(!)
  • 17秒:第三方API返回结果

我的问题:

  • 是否有明显的原因延迟调用次要function? 这似乎不是由于冷启动问题造成的,因为云function很快就会出现,即使在重复呼叫之后延迟也是一致的。
  • 使用“请求”节点模块导致问题? 有没有更好的模块来创build/pipe理云function的http请求?

你可以在这里看到index.js的一个简化的要点: https : //gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65

这里是抓取显示示例时间的Firebase控制台。 注意:输出与上面的代码略有不同,因为我简化了上面的代码以帮助理解。 在这里输入图像描述

getInfoFrom3rdParty()调用是一个asynchronous事件。 但是,你还没有从你的函数中返回一个promise,所以函数不会等待asynchronous事件完成。

它看起来像我,因为你正在返回未定义,function还假定它失败并重试。 在重试过程中的某个时刻,asynchronous事件可能在函数退出之前完成(即由于竞争条件而无意的成功)。 在其他情况下,我看到了类似的结果,用户在其function中没有返回承诺或价值。

我无法从这个要点上看出你想要做什么 – 它看起来并没有对第三方的结果做任何事情,也可能不是你的用例的现实主义。 但是像这样的东西可能是你想要的东西:

 exports.getInfo = functions.https.onRequest((request, response) => { // .... // NOTE THE RETURN; MOST IMPORTANT PART OF THIS SAMPLE return getInfoFromThirdParty(...).then(() => { response.writeHead(200, {"Content-Type": "application/json"}); response.end(JSON.stringify(payload)); }).catch(e => /* write error to response */); }); function getInfoFrom3rdParty(food) { reqObj.body = '{"query": "'+food+'"}'; return new Promise((resolve, reject) => { mainRequest(reqObj, function (error, response, body) { // .... if( error ) reject(error); else resolve(...); // .... }); }); }