修改后报错 errMsg: TypeError: Cannot read property 'concat' of undefined
云数据库await查询全部数据的官方文档示例代码有BUG!官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/collection.get.html 有BUG的示例:示例代码 3:取集合所有数据 今天我的小程序在用户使用反馈到一个问题,数据导出提示出错,很明显新项目刚测试还未正式上线今天并没有产生要到处的数据。 于是到开发工具的云控制台,查询云函数的运行日志,发现有如下的报错信息: {"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"Reduce of empty array with no initial value"} 由于没遇到过这个问题,于是就查询了MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Errors/Reduce_of_empty_array_with_no_initial_value 所以知道,这个原因是因为reduce的数据为空。 虽然只是个实例代码,但作为文档参考,很多新手还是会直接照搬代码,我建议官方要把这个代码优化一下,修改之后如下: [代码]const cloud = require([代码][代码]'wx-server-sdk'[代码][代码])[代码][代码]cloud.init()[代码][代码]const db = cloud.database()[代码][代码]const MAX_LIMIT = 100[代码][代码]exports.main = async (event, context) => {[代码][代码] [代码][代码]// 先取出集合记录总数[代码][代码] [代码][代码]const countResult = await db.collection([代码][代码]'todos'[代码][代码]).count()[代码][代码] [代码][代码]const total = countResult.total[代码][代码] [代码][代码]// 计算需分几次取[代码][代码] [代码][代码]const batchTimes = Math.ceil(total / 100)[代码][代码] [代码][代码]// 承载所有读操作的 promise 的数组[代码][代码] [代码][代码]const tasks = [][代码][代码] [代码][代码]for[代码] [代码](let i = 0; i < batchTimes; i++) {[代码][代码] [代码][代码]const promise = db.collection([代码][代码]'todos'[代码][代码]).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()[代码][代码] [代码][代码]tasks.push(promise)[代码][代码] [代码][代码]}[代码][代码] [代码][代码]// 等待所有[代码][代码] [代码][代码]const result =[代码] [代码](await Promise.all(tasks)).reduce((acc, cur) => {[代码][代码] [代码][代码]return[代码] [代码]{[代码][代码] [代码][代码]data: acc.data.concat(cur.data),[代码][代码] [代码][代码]errMsg: acc.errMsg,[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}, -Infinity)[代码] [代码] result.data = result.data || [] // 处理 没有数据时 reduce 结果 undefined 的情况[代码] [代码] return result [代码] [代码]}[代码]修改了 reduce,增加一个参数 initialValue,资料参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce -----------完毕-------------
2022-12-27