收藏
回答

云函数中通过async-await的方式无法访问数据库

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
 
const db = cloud.database()
const MAX_LIMIT = 100
 
// 云函数入口函数
exports.main = async (event, context) => {
  // 查询当前用户所有的 page-list 总数
  const countResult = await db.collection('page-list').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('page-list').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  // 等待所有
  return (await Promise.all(tasks)).reduce((acc, cur) => {
    return {
      data: acc.data.concat(cur.data),
      errMsg: acc.errMsg,
    }
  })
}


这段代码通过云函数查询数据库,但是每次都会报这个错,找不到‘page-list'这个表

[云函数] [sum] 调用失败 Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID 883d6524-f495-11e8-950a-5254005d5fdb, cloud function service error code -504002, error message Error: errCode: -502005 database collection not exists | errMsg: Collection `page-list` is not exists;


而这个表,不通过async-await的方式,直接去访问正常的,并且async-await方法去做其他异步操作也是正常的,唯独在云函数里访问数据库会异常。到底是为什么?

最后一次编辑于  2018-11-30  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

2 个回答

  • 濯涟散人
    濯涟散人
    2018-12-01

    我也遇到了类似的情况,以下是解决办法。

    问题应该是出在cloud.init()这一行,初始化不完整。建议改成以下:

    cloud.init({

     traceUser: true,

     env: 'xxxxx'  //这里是你自己设置的云开发环境的名称

    })

    希望对你有所帮助。


    2018-12-01
    赞同 3
    回复 5
    • 陈博鹏
      陈博鹏
      2018-12-02

      6666,大兄弟,多谢了,之前只在app.js中完整设置了这个,这个地方确实也需要完整初始化一下!

      2018-12-02
      回复
    • 君 ᴸᴵᴺ
      君 ᴸᴵᴺ
      2018-12-08

       我也遇到这个问题,但加了traceUser: true,也不行,请问如何解决?

      2018-12-08
      回复
    • 濯涟散人
      濯涟散人
      2018-12-10回复君 ᴸᴵᴺ

      关键是env那一行,要把你自己的云环境名称加进去。

      2018-12-10
      回复
    • 君 ᴸᴵᴺ
      君 ᴸᴵᴺ
      2018-12-11回复濯涟散人

       加了env一行的。本来是正常读取的,但用了异步变同步处理就读不出数据了,急死!

      2018-12-11
      回复
    • 濯涟散人
      濯涟散人
      2018-12-12回复君 ᴸᴵᴺ

      你的具体情况我不了解,实在无法解答。只能告诉你一些原则性的东西。主要是明确代码各个部分的环境参数一致,且根据你要实现的目的选择了合适的方法。

      2018-12-12
      回复
  • HS
    HS
    2018-11-30

    不通过async-await的方式,直接去访问,是指的怎样的写法呢

    2018-11-30
    赞同
    回复 1
    • 27
      27
      06-04

      我也遇到了,确实需要在云函数的 cloud.init() 中,加 env: 'xxx' 初始化。

      不过为啥要这样呢?

      当前环境已经切换了呀

      06-04
      回复