收藏
回答

httpapi方式调用有request-promise同步请求的云函数会执行两次

框架类型 问题类型 终端类型 AppID 基础库版本
小程序 Bug 客户端 wx03fca893158cc038 2.7.2

问题: http api 云函数调用经常报系统错误。

过程:

有两个小程序分别各自有一个云函数,

记做

小程序a     有云函数 voiceCall

小程序b     有云函数 voiceCallForOther

voiceCall 使用http api方式调用 voiceCallForOther

---------------------------------------------------------------------------------------------------------

voiceCall     的调用日志

2019-07-04 18:55:35调用成功

日志内容 Request ID: 402f3ba3-9e4a-11e9-ac86-525400681fe1

执行时间: 1830.61ms内存使用: 19.49 MB

返回结果

{"voiceUrl":"","message":"fail"}

日志

START RequestId: 402f3ba3-9e4a-11e9-ac86-525400681fe1

Event RequestId: 402f3ba3-9e4a-11e9-ac86-525400681fe1


中途http api 调用voiceCallForOther的响应结果

{ errcode: -1, errmsg: 'system error hint: [X1z6ta07363040!]' }


------------------------------------------------------

voiceCallForOther 的 响应   居然有两条


2019-07-04 18:55:36调用成功

日志内容 Request ID: 40e47bbf-9e4a-11e9-a5c2-525400b2c41b

执行时间: 3814.51ms内存使用: 1.16 MB

返回结果

{"resultFileURL":"","resultFileID":"","message":"OK"}

日志

START RequestId: 40e47bbf-9e4a-11e9-a5c2-525400b2c41b

Event RequestId: 40e47bbf-9e4a-11e9-a5c2-525400b2c41b



2019-07-04 18:55:37调用成功

日志内容 Request ID: 415ccd29-9e4a-11e9-a5c2-525400b2c41b

执行时间: 1845.12ms内存使用: 21.29 MB

返回结果

{"resultFileURL":"","resultFileID":"","message":"OK"}

日志

START RequestId: 415ccd29-9e4a-11e9-a5c2-525400b2c41b

Event RequestId: 415ccd29-9e4a-11e9-a5c2-525400b2c41b




总结调用

voiceCall 云函数使用 http api invokecloudfunction  方式调用  voiceCallForOther 云函数  ,voiceCallForOther 云函数会执行两次,

所以voiceCall  总是收到 系统错误的返回结果


{ errcode: -1, errmsg: 'system error hint: [X1z6ta07363040!]' }



请问为什么出现这种结果?如何修正?




-----------------------------------------------------------------------------------------------------------------

找到原因

经过查证,是voiceCallForOther 云函数里面 有个函数 (rp为request-promise)

function getAccessToken(subscriptionKey) {

 let options = {

   method: 'POST',

   uri: uri,

   headers: {

     'Ocp-Apim-Subscription-Key': subscriptionKey

   }

 }


 return rp(options);

}


var accessToken = await getAccessToken(key);


只要执行await getAccessToken(key);    云函数voiceCallForOther 就会重新被系统再调用一次,和第一次一样的参数和代码执行。

发现过程:我把 await getAccessToken(key); 注释掉,就没有调用第二次voiceCallForOther 了。

诡异的是 第二次voiceCallForOther 执行的是和第一次一样的代码,所以第二次还是会执行 await getAccessToken(key),为什么第二次执行没有引发第三次 自身触发?


请官方或者大神来帮忙解惑,解决我的问题?头疼。


-----------------------------------------------------------------------------------------

自己把await getAccessToken(key);注释了,

执行另一个含有request-promise请求的 内部函数


voiceCallForOther 云函数依然会被执行两次。


大bug:httpapi方式调用有request-promise同步请求的云函数会执行两次


另外:我开始本地调试voiceCallForOther 运行是没有问题的。 只是http api方式调用voiceCallForOther ,会执行两次。voiceCallForOther 含有同步await  request-promise请求。



吐槽:httpapi调用对云函数的响应时间只有5s。

我花了2天时间 减少云函数的运行响应时间在5s以内。

接着还有2两天时间,研究调查这个httpapi 调用这个大bug。。。。。。。。。。。。。。

总计4天时间

强烈要求官方来答一波

最后一次编辑于  2019-07-05
回答关注问题邀请回答
收藏

3 个回答

  • naofy
    naofy
    2019-07-26

    遇到一样的问题,只要通过httpapi调用云函数,就有很高的机率执行两次。我觉得不像是request-promise的问题,一是因为它更久经考验,二是如果是rp重复发了,应该有两个response,实际上收到的response只有一个,而且是system error hint。更怀疑是云函数通过httpapi调用时有问题,希望官方调查给与答复。

    请问楼主有找到症结吗?

    2019-07-26
    有用
    回复 3
    • Derrick舰长
      Derrick舰长
      2019-08-11
      兄弟,没有找到。 把这个帖子顶上去,让官方看看。哈哈
      2019-08-11
      回复
    • naofy
      naofy
      2019-08-11
      我另发了帖子问,官方说是个已知问题,进行了升级,后来就没问题了。
      2019-08-11
      回复
    • Derrick舰长
      Derrick舰长
      2019-09-24
      这个已知问题的坑比较大。官方都没理我。。。。。
      2019-09-24
      回复
  • 铭锋科技
    铭锋科技
    2019-07-07

    谢邀,讲真,云开发不会也不会去学云开发

    2019-07-07
    有用
    回复
  • Alonzo Church
    Alonzo Church
    2019-07-04

    从调用时间和调用耗时上看,你贴出来的这两个voiceCallForOther的调用结果都不会被2019-07-04 18:55:35的这次voiceCall的调用拿到。

    另外这两次voiceCallForOther的调用都成功了,那voiceCall拿到的系统错误的结果肯定是另外的voiceCallForOther过程产生的。

    建议在voiceCallForOther的参数中增加一个用来跟踪请求的字段,确定两个函数的调用关系。

    2019-07-04
    有用
    回复 2
    • Derrick舰长
      Derrick舰长
      2019-07-05

      找到原因了,voiceCallForOther 里面的第三方request-promise请求 引发的自身voiceCallForOther重新被调用一次。发现过程见正文。


      但是这本身很诡异。

      还是没有解决我的问题。

      有没有碰到类似的问题?

      2019-07-05
      回复
    • Alonzo Church
      Alonzo Church
      2019-07-12回复Derrick舰长
      建议自查一下代码逻辑,后台运行环境不可能出现这种多此一举的行为的
      2019-07-12
      回复
登录 后发表内容