收藏
回答

云数据库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


-----------完毕-------------

回答关注问题邀请回答
收藏

4 个回答

  • Roy
    Roy
    2022-12-27

    修改后报错 errMsg: TypeError: Cannot read property 'concat' of undefined

    2022-12-27
    有用
    回复
  • A-alice
    A-alice
    2020-12-17

    我目前也是这个问题 ,抄过来的不知道咋解决目前正在尝试

    2020-12-17
    有用
    回复
  • 云和山的彼端
    云和山的彼端
    2019-10-15

    老哥先给你个赞,回头我试下

    2019-10-15
    有用
    回复
  • Rocbin.Yu[让我看看]
    Rocbin.Yu[让我看看]
    2019-07-24

    修改后程序功能运行正常。

    2019-07-24
    有用
    回复
登录 后发表内容