- httpapi方式调用有request-promise同步请求的云函数会执行两次
问题: 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-04 - invokeCloudFunction调用报非法参数错误
官方给的文档中,给的例子是 curl调用 [代码]curl -d '{}' \ 'https://api.weixin.qq.com/tcb/invokecloudfunction?access_token=ACCESS_TOKEN&env=ENV&name=login'[代码] 是这样的。 能不能给一个node.js request模块请求的例子。 我的url 和postdata在在线curl工具中调用是 正确的,返回正确的数据格式。 但是我在node.js中用request模块 post 请求的时候总是报非法参数错误。很无奈。 以下是我的代码 var body ={} var bodyString = JSON.stringify(body); let options = { url: url, method: 'POST', json: true, headers: { 'Content-Type': 'application/json' }, body: bodyString } var result = new Promise(function (resolve, reject) { request.get(options, function (error, response, body) { if (error) { reject(error); console.log(new Date().getTime() + ' end error=' + error) } else { resolve(body); console.log(new Date().getTime()+' end body=' , body) } }); }); 结果总是 "Invalid request param hint: [msol406152028]"
2019-06-30 - 同一个小程序云函数不同次调用,后台执行时间差别太大,时间差别50倍,啥原因?
同一个小程序云函数不同次调用,后台执行时间差别太大,时间差别50倍,啥原因? 我贴出来后台云函数调用执行日志 1第一条日志 执行时间: 5523.23ms内存使用: 236.00 KB 返回结果 日志 START RequestId: 546c04a7-9569-11e9-a04a-525400e8849e Event RequestId: 546c04a7-9569-11e9-a04a-525400e8849e 2019-06-23T03:45:23.208Z ------start genSig time=1561261523208 2019-06-23T03:45:23.209Z ------end genSig time=1561261523209 2019-06-23T03:45:23.209Z ------查询user表开始 time=1561261523209 2019-06-23T03:45:26.212Z Database operation is longer than 3s. Please check query performance and your network environment. 2019-06-23T03:45:28.731Z ------查询user表结束 time=1561261528731 END RequestId: 546c04a7-9569-11e9-a04a-525400e8849e Report RequestId: 546c04a7-9569-11e9-a04a-525400e8849e Duration:5523ms Memory:256MB MaxMemoryUsed:0.230469MB 此次查询user表花时间3s以上达到5s, 2再看下一条调用日志 日志内容 Request ID: d566f74e-9582-11e9-a04a-525400e8849e 执行时间: 98.15ms内存使用: 1.29 MB 返回结果 日志 START RequestId: d566f74e-9582-11e9-a04a-525400e8849e Event RequestId: d566f74e-9582-11e9-a04a-525400e8849e 2019-06-23T06:47:57.035Z ------start genSig time=1561272477035 2019-06-23T06:47:57.035Z ------end genSig time=1561272477035 2019-06-23T06:47:57.035Z ------查询user表开始 time=1561272477035 2019-06-23T06:47:57.132Z ------查询user表结束 time=1561272477132 END RequestId: d566f74e-9582-11e9-a04a-525400e8849e Report RequestId: d566f74e-9582-11e9-a04a-525400e8849e Duration:98ms Memory:256MB MaxMemoryUsed:1.289062MB 此次查询user表花时间100毫秒左右,很快很满意 云函数没改代码啊,两次都是同样的代码。是登录函数 云函数是咋运行的? 其它几次调用平均时间是3s左右,我就不贴出来了。就贴出来最快时间日志和最慢时间日志。都有RequestId 请官方来告诉我解决的方法,急!!!。小程序登录太慢
2019-06-23 - 如何在小程序中获取公众号appid,当从公众号文章点击跳转到小程序时
多个不同公众号文章中嵌入了我的小程序,如何在我小程序中获取公众号appid,让我知道是哪个公众号跳转过来的。?
2019-05-13 - 在request监听函数中使用数据库操作等await 函数报错
问题: 在request监听函数中使用数据库操作等await 函数报await is only valid in async function错误 背景: 因业务需要,需要向第三方发送http request再根据response结果做业务操作,如果成功(statusCode为200时)则做云数据库,云存储操作。如果失败,则啥都不做。 则代码逻辑结构如下,不能直接运行,只是为了展示逻辑结构: // 云函数入口函数 exports.main = async (event, context) => { const buffer = await request.get(url) buffer.on("response", function (res) { if (res.statusCode == '200'){ //数据库操作, 这些都是await方法 await cloud.uploadFile({ cloudPath: filePath, fileContent: buffer, }).then() .catch(error) } } return {} } await async 这些关键词 都是啥用法
2019-04-17 - db.serverdate()如何获取年份字符串和月份字符串?
db.serverdate()如何获取年份字符串和月份字符串?
2019-04-11 - 小程序云函数下载网络文件上传到云存储中,报 write ECONNRE错误
原始需求:小程序前端播放其它网站的网络音频文件, 遇到的问题:我要访问的网站是国外的https,它没有在工信部备案,不算合法域名。然而微信前台https访问要做合法域名校验,无法通过校验,因此,无法通过小程序前端调用。 自己想的解决方法:给小程序增加云开发后台,然后在云开发后台下载资源网站的音频文件到小程序后台云存储中。这样小程序前端就可以成功调用云开发后台的文件。 现问题:在云开发后台把来自其它站点的网络文件下载后,然后上传到云存储中,报错。 1)第一次尝试解决 我的关键代码 如下: const synthesizeStream = textToSpeech.synthesizeUsingWebSocket(synthesizeParams);//这是来自其它网站的文件流 synthesizeStream.pipe(fs.createWriteStream(filePath));//成功写入本地开发环境的硬盘 使用开发工具 在云开发本地调试是可以运行的,把从第三方发过来的synthesizeStream 通过pipe方法写入到本地磁盘,生成文件。 但是 使用开发工具在云开发网络调试的时候,由于云开发的云存储不可写只可读,不能使用pipe方法所以只能使用官方的api上传文件。 疑问:这和云开发控制台 存储管理菜单下的权限管理子菜单功能有关系吗? 2)第二次尝试解决 我使用如下官方文档的方法 await cloud.uploadFile({ cloudPath: 'Hello world.mp3', fileContent: synthesizeStream }) 报错误: VM412 index.js:163 Error: errCode: -1 unknown error | errMsg: uploadFile:fail Error: write ECONNABORTED; at uploadFile api; at new CloudSDKError (E:\xcx_englishreading_cloud\cloudfunctions\ibmVoiceCall\node_modules\wx-server-sdk\index.js:4332:28) at returnAsCloudSDKError (E:\xcx_englishreading_cloud\cloudfunctions\ibmVoiceCall\node_modules\wx-server-sdk\index.js:4384:16) at Object.returnAsFinalCloudSDKError (E:\xcx_englishreading_cloud\cloudfunctions\ibmVoiceCall\node_modules\wx-server-sdk\index.js:4398:13) at Cloud.<anonymous> (E:\xcx_englishreading_cloud\cloudfunctions\ibmVoiceCall\node_modules\wx-server-sdk\index.js:3864:62) at step (E:\xcx_englishreading_cloud\cloudfunctions\ibmVoiceCall\node_modules\tslib\tslib.js:133:27) at Object.throw 望解答疑问。感谢。
2019-04-08 - 小程序云开发后台对第三方https请求,检验合法域名吗?
我在小程序前端中调用第三方https链接,但是第三方https链接在中国没有备案,所以无法调用。 那么云开发后台调用的话,会校验吗? 如果自己整个后台,就不用校验https请求是否在中国备案。 但是小程序云开发 简单快速。
2019-04-02 - 微信是否在封杀 社交类小程序?
微信是否在封杀 社交类小程序? 前一阵子 马桶 多闪 聊天宝 三款社交app战微信,遭到微信封杀。 微信内是否还能做社交类小程序?
2019-03-14 - button disabled 设置为true后,但是还是响应点击事件
button disabled 为true后,但是还是响应点击事件 代码如下 <button type ="primary" disabled='{{isButtonDisabled}}' catchtouchstart="streamRecord" catchtouchend="streamRecordEnd" class='button'>长按button> isButtonDisabled 为true后,按钮界面上显示为不可用。但是我点击,catchtouchstart catchtouchend 这两个事件依然生效。 wechatide://minicode/Mz9J4cmz7b4v
2018-07-26