问题: 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天时间。
强烈要求官方来答一波
遇到一样的问题,只要通过httpapi调用云函数,就有很高的机率执行两次。我觉得不像是request-promise的问题,一是因为它更久经考验,二是如果是rp重复发了,应该有两个response,实际上收到的response只有一个,而且是system error hint。更怀疑是云函数通过httpapi调用时有问题,希望官方调查给与答复。
请问楼主有找到症结吗?
谢邀,讲真,云开发不会也不会去学云开发
从调用时间和调用耗时上看,你贴出来的这两个voiceCallForOther的调用结果都不会被2019-07-04 18:55:35的这次voiceCall的调用拿到。
另外这两次voiceCallForOther的调用都成功了,那voiceCall拿到的系统错误的结果肯定是另外的voiceCallForOther过程产生的。
建议在voiceCallForOther的参数中增加一个用来跟踪请求的字段,确定两个函数的调用关系。
找到原因了,voiceCallForOther 里面的第三方request-promise请求 引发的自身voiceCallForOther重新被调用一次。发现过程见正文。
但是这本身很诡异。
还是没有解决我的问题。
有没有碰到类似的问题?