httpapi方式调用有request-promise同步请求的云函数会执行两次
发布于 6 年前 作者 qlai 13121 次浏览 来自 问答

问题: 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天时间

强烈要求官方来答一波

3 回复

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

请问楼主有找到症结吗?

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

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

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

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

回到顶部