在cocos creator中使用微信云函数教程

第一步 使用creator v2.0.9 创建一个空项目 A

第二步 使用微信开发者工具创建一个带有云开发环境微信小游戏项目 B

第三步 使用微信开发者工具的云开发创建两个云环境,一个debug,一个release

第四步 把项目B中的 cloudfunction 文件夹打包成rar备用

第五步 使用creator 构建小游戏项目C

第六步 修改项目C的project.config.json 添加一个字段 “cloudfunctionRoot”: “cloudfunction/” ,把第四步的解压到wechatgame目录下。就可以添加云函数,上传云函数了。

第七步 修改项目C的game.js,在window.boot()之前,添加一段代码:wx.cloud.init({env:‘debug’})

第八步 在项目A中使用wx.cloud,打包成微信小游戏后,重复第六步、第七步。

到此,就可以在主项目中使用云函数了。

注:微信开发者工具里面,点击详情,查看调试基础库,选择2.6.2 太老的版本不能调用wx.cloud

4赞

mark

mark

每次构建完,都要重复第四步吧

mark

mark,感谢楼主

后端用了云函数,包体资源放哪里呢?

包体资源应该也是放在云存储中,然后下载用云函数去下载

mark

我之前也这么想过,但是云存储直接放不了文件夹。难道是要把res压缩一下上传,然后在云函数中解压吗

写个云函数遍历文件夹里的文件,就能把res传上去。
// 云函数入口文件
const cloud = require(‘wx-server-sdk’)
const fs = require(‘fs’)
const path = require(‘path’)

// 与小程序端一致,均需调用 init 方法初始化
cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
// const { ENV, OPENID, APPID } = cloud.getWXContext()
// console.log(ENV);
// // 更新默认配置,将默认访问环境设为当前云函数所在环境
let ENV = event.env;
console.log(ENV);
if(ENV !== null){
cloud.updateConfig({
env: ENV
})
}
let gameVersion = event.gameVersion;
let localRoot = path.resolve(__dirname, “…/…/”) + ‘/wechatgame’;
let localPath = path.join(localRoot, ‘/res’);
let remotePath = ‘gameRes/’ + gameVersion + ‘/’;
console.log(localRoot);
console.log(remotePath);
let filesArr = [];
console.log(localPath);
fileDisplaySync(filesArr, localPath);
for(let i = 0; i < filesArr.length; i++){
let path = filesArr[i].replace(localRoot,"");
let fileStream = fs.createReadStream(filesArr[i]);
let remotePath = ‘gameRes/’ + gameVersion + path;
await cloud.uploadFile({
cloudPath: remotePath,
fileContent: fileStream,
})
}
}

/**

  • 文件遍历方法
  • @param filePath 需要遍历的文件路径
    */
    function fileDisplay(filesArr,filePath) {
    //根据文件路径读取文件,返回文件列表
    fs.readdir(filePath, function (err, files) {
    if (err) {
    console.warn(err)
    } else {
    //遍历读取到的文件列表
    files.forEach(function (filename) {
    //获取当前文件的绝对路径
    var filedir = path.join(filePath, filename);
    //根据文件路径获取文件信息,返回一个fs.Stats对象
    fs.stat(filedir, function (eror, stats) {
    if (eror) {
    console.warn(‘获取文件stats失败’);
    } else {
    var isFile = stats.isFile();//是文件
    var isDir = stats.isDirectory();//是文件夹
    if (isFile) {
    filesArr.push(filedir);
    console.log(filedir);
    }
    if (isDir) {
    fileDisplay(filesArr,filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
    }
    }
    })
    });
    }
    });
    }

function fileDisplaySync(filesArr, filePath) {
//根据文件路径读取文件,返回文件列表
let files = fs.readdirSync(filePath);
//遍历读取到的文件列表
files.forEach(function (filename) {
//获取当前文件的绝对路径
var filedir = path.join(filePath, filename);
//根据文件路径获取文件信息,返回一个fs.Stats对象
let stats = fs.statSync(filedir);
var isFile = stats.isFile();//是文件
var isDir = stats.isDirectory();//是文件夹
if (isFile) {
filesArr.push(filedir);
}
if (isDir) {
fileDisplaySync(filesArr, filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
}
});
}