原始需求:小程序前端播放其它网站的网络音频文件,
遇到的问题:我要访问的网站是国外的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
望解答疑问。感谢。
只能通过第二种方案,但是你的问题应该是出在synthesizeStream这个数据流上,uploadFile接口的fileContent只接受Buffer或fs.ReadStream,你可以试试将websocket改成直接http请求获取Buffer,再通过uploadFile接口上传。
感谢,问题已经解决。
使用 node.js 的request 请求第三方的https api,获取的buffer能够通过uploadFile接口上传到云存储。
老板,您这多大的生意呀,都做到国外去了。刚需的话不能定时同步在自己服务器上嘛,我也是醉了。。。
坐等小程序云开发官方来解答,难道是让我弃用小程序云开发,转去腾讯云 再重新写一个服务器后台?这样就不省事了