云函数代码问题(数据库导入导出)?
发布于 6 年前 作者 tkong 3489 次浏览 来自 官方Issues

/* eslint-disable */

const request = require(‘request’);

const cloud = require(‘wx-server-sdk’);

// 环境变量

const env = ‘xxxx’;

cloud.init({

  env

});

// 换取 access_token

async function getAccessToken(appid, secret) {

  return new Promise((resolve, reject) => {

    request.get(

      `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,

      (err, res, body) => {

        if (err) {

          reject(err);

          return;

        }

        resolve(JSON.parse(body));

      }

    );

  });

}

// 创建导出任务

async function createExportJob(accessToken, collection) {

  const date = new Date().toISOString();

  return new Promise((resolve, reject) => {

    request.post(

      `https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=${accessToken}`,

      {

        body: JSON.stringify({

          env,

          file_path: `${date}.json`,

          file_type: ‘1’,

          query: `db.collection("${collection}").get()`

        })

      },

      (err, res, body) => {

        if (err) {

          reject(err);

        }

        resolve(JSON.parse(body));

      }

    );

  });

}

// 查询导出任务状态

async function waitJobFinished(accessToken, jobId) {

  return new Promise((resolve, reject) => {

    // 轮训任务状态

    const timer = setInterval(() => {

      request.post(

        `https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=${accessToken}`,

        {

          body: JSON.stringify({

            env,

            job_id: jobId

          })

        },

        (err, res, body) => {

          if (err) {

            reject(err);

          }

          const { status, file_url } = JSON.parse(body);

          console.log(‘查询’);

          if (status === ‘success’) {

            clearInterval(timer);

            resolve(file_url);

          }

        }

      );

    }, 500);

  });

}

exports.main = async (event, context) => {

  // 从云函数环境变量中读取 appid 和 secret 以及数据集合

  const { appid, secret, backupColl, backupInfoColl } = process.env;

  const db = cloud.database();

  try {

// 获取 access_token

    const { errmsg, access_token } = await getAccessToken(appid, secret);

    if (errmsg && errcode !== 0) {

      throw new Error(`获取 access_token 失败:${errmsg}` || ‘获取 access_token 为空’);

    }

    // 导出数据库

    const { errmsg: jobErrMsg, errcode: jobErrCode, job_id } = await createExportJob(access_token, backupColl);

    // 打印到日志中

    console.log(job_id);

    if (jobErrCode !== 0) {

      throw new Error(`创建数据库备份任务失败:${jobErrMsg}`);

    }

    // 将任务数据存入数据库

    const res = await db.collection(‘db_back_info’).add({

      data: {

        date: new Date(),

        jobId: job_id

      }

    });

    // 等待任务完成

    const fileUrl = await waitJobFinished(access_token, job_id);

    console.log(‘导出成功’, fileUrl);

    // 存储到数据库

    await db

      .collection(backupInfoColl)

      .doc(res._id)

      .update({

        data: {

          fileUrl

        }

      });

  } catch (e) {

    throw new Error(`导出数据库异常:${e.message}`);

  }

};我想走这段代码env为环境变量但是走不了,会被抓到错误。不知道是不是代码写的有问题

1 回复
回到顶部