微信云托管

微信云托管

官方介绍是微信团队提供的以云原生为基础的,免运维、高可用服务上云解决方案,无需服务器,1分钟即可部署小程序/公众号服务端。

**最重要的是:**与微信生态深度融合,具有免鉴权,云调用,消息推送,微信支付等众多微信优势特性,开发者可以非常轻松和高效的完成互通,

与常规的云服务的区别用一张图表示就是

image

趁着有需求的机会,开始吧,开葬吧!

前置条件:

前置知识

直接用小程序/公众号的云调用方法,可以直接不需要开启公网访问,而且还会有更多的便利,直接获取openid等用户信息。

服务无需备案,直接可用,不过小程序发布需要备案。

如果需要重新需要处理一个后台,通过公网访问的话,那需要注册域名,备案,绑定。

大概流程

  1. 注册小程序
  2. 启用云托管,新建服务(当就可以测试api了)
  3. 新建自己的仓库(fork官方)
  4. 更改流水线
  5. 写API接口代码,提交测试
  6. 写小程序页面调用代码。

一、注册小程序

自已去

二、启用云托管,新建服务

扫码进入云托管控制台,基于模板新建,前端直接选express或者Koa都行。

image

image

image

结束会有账号的一些相关信息,填写数据库密码,点击完成就行,其它在服务里面可以设置。

点击侧边栏的服务列表,选择你刚刚创建的服务,切换到服务设置里面的环境变量确认是否正确,修改最小实例副本数为:1.默认是0,如果是0的话30分钟没有请求会自动停止。

这时候就可以点击云调调试,访问测试示例模板里面的两个接口了。

image

image

对应的就是官方仓库里面的两段代码。

image

三、新建自己的仓库

然后页面打开到服务列表--部署发布,打开基于模板开发,打开官方模板的github仓库,fork一份到自己的账号下。

image

修改流水线,测试

啥也不改,然后到云托管后台,服务列表--服务设置--流水线,授权github,填入刚刚fork的仓库,选择分支,推送到分支的时候触发流水线自已看着勾。

git clone 把自己仓库的代码拉到本地,修改'/api/count'改为'/api/number',提交推送到线上,触发流水线自动重新发布。

image

- `index.js`:项目入口,实现主要的读写 API
- `db.js`:数据库相关实现,使用 `sequelize` 作为 ORM
- `index.html`:首页代码
- `package.json`:Node.js 项目定义文件
- `container.config.json`:模板部署「服务设置」初始化配置(二开请忽略)
- `Dockerfile`:容器配置文件
// 获取计数
app.get("/api/number", async (req, res) => {
  const result = await Counter.count();
  res.send({
    code: 0,
    data: result,
  });
});

云端调试原来的count已经是404,改为number则返回原来正确的值。

image

到这里其实就已经可以去小程序里面调用接口了,如果需要其它的接口,打开sequelize的网站文档,对着文档进行Counter表的操作,增删改查都可以。

小程序里面的调用先在app.js里面的onLaunch里面增加上wx.cloud的初始化

   wx.cloud.init({
      env: '云环镜ID', // 替换为您的云环境 ID
      traceUser: true,    // 可选,是否记录用户访问日志
    });

在小程序里面用wx.cloud调用接口信息。当然也可以直接去复制调用代码。后面我把这个方法封装了一下。

wx.cloud.callContainer({
  "config": {
    "env": "云环镜ID"
  },
  "path": "/notes",
  "header": {
    "X-WX-SERVICE": "服务器名称",
    "content-type": "application/json"
  },
  "method": "GET",
  "data": {
    "content": "微信小程序开发一个随手记的功能,主要功能描述:首页一个数入框,可以输入一段文字,下面一个按钮,可以保存本次输入。下面有一个列表,显示历史存入的记录,按时间倒序,内容和时间都可以显示。每个用户都只能查看自己的记录。给我返回该功能的sequelize.define模型实例,和express的api接口代码,用户openid直接从云托管的header中获取"
  }
})

image

正经搞个功能

可以打开sequelize的网站,查看sequelize操作数据库的使用方法。因为我不想看直接上AI了

提示词:

微信小程序开发一个随手记的功能,主要功能描述: 首页一个数入框,可以输入一段文字,下面一个按钮,可以保存本次输入。 下面有一个列表,显示历史存入的记录,按时间倒序,内容和时间都可以显示。 每个用户都只能查看自己的记录。给我返回该功能的sequelize.define模型实例,和express的api接口代码,用户openid直接从云托管的header中获取

然后AI会给我们一份sequelize的代码和express的两个接口的代码

然后我们把db.js的代码里面加上的代码

const { Sequelize, DataTypes } = require("sequelize");

// 从环境变量中读取数据库配置
// 如果是本地跑了试话,直接这里的变量值设为环境变量里面的信
const { MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_ADDRESS = "" } = process.env;

const [host, port] = MYSQL_ADDRESS.split(":");

// 默认测试的nodejs_demo
const sequelize = new Sequelize("nodejs_demo", MYSQL_USERNAME, MYSQL_PASSWORD, {
  host,
  port,
  dialect: "mysql" /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
});

// 定义数据模型
const Counter = sequelize.define("Counter", {
  count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 1,
  },
});

// 定义日记的数据模型
const Note = sequelize.define("Note", {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  content: {
    type: DataTypes.TEXT,
    allowNull: false,
  },
  userOpenId: {
    type: DataTypes.STRING,
    allowNull: false,
  }
}, {
  sequelize,
  modelName: 'Note',
  timestamps: true, // 自动添加 createdAt 和 updatedAt 字段
});

// 数据库初始化方法
async function init() {
  await sequelize.sync(); // 这个地方原来是Count的,把他改为sequelize,不然新的Note表不会同步
}

// 导出初始化方法和模型
// 把Note抛出去
module.exports = {
  init,
  Counter,
  Note
};

index.js里面加上新的接口代码

最前面把Note从db里面引入进来
const { init: initDB, Counter,Note } = require("./db");

// 创建新的记录
app.post('/notes', async (req, res) => {
  const userOpenId = req.headers["x-wx-openid"]; // 从请求头中获取用户的 OpenID

  const { content } = req.body;

  try {
    const note = await Note.create({ content, userOpenId });
    res.status(201).json(note);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

// 获取用户的所有记录
app.get('/notes', async (req, res) => {
  const userOpenId = req.headers["x-wx-openid"]; // 从请求头中获取用户的 OpenID

  try {
    const notes = await Note.findAll({
      where: { userOpenId },
      order: [['createdAt', 'DESC']], // 按时间倒序排列
    });
    res.json(notes);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

到这里我们把git提交推送就行了,流水线是自动重新发布。下面就是在后台在线调试里面测试一下,接口是否可行就行了。

image

小程序调用

用外网访问的话,可以直接用小程序的request封装方法,但是那样的话,就要走常规的登录请求了,无法用云托管最强大的便利了,不需要wx.login拿code去服务端换取信息,直接在请求头里面就拿到用户的信息。

header说明
X-WX-OPENID小程序用户 openid
X-WX-APPID小程序 AppID
X-WX-UNIONID小程序用户 unionid,并且满足 unionid 获取条件时有
X-WX-FROM-OPENID资源复用情况下,小程序用户 openid
X-WX-FROM-APPID资源复用情况下,使用方小程序 AppID
X-WX-FROM-UNIONID资源复用情况下,小程序用户 unionid,并且满足 unionid 获取条件时有
X-WX-ENV所在云环境 ID
X-WX-SOURCE调用来源(本次运行是被什么触发)
X-Forwarded-For客户端 IPv4 或IPv6 地址

前面说过了,这里在用wx.cloud的方法去调用,首页在app.js里面的onLaunch里面增加上wx.cloud的初始化

   wx.cloud.init({
      env: '云环镜ID', // 替换为您的云环境 ID
      traceUser: true,    // 可选,是否记录用户访问日志
    });

根据官方的云调用示例封装一个方法

// 封装请求方法
const request = (url, method, data) => {
  return new Promise((resolve, reject) => {
    wx.cloud.callContainer({
      config: {
        env: "云环境 ID"
      },
      path: url,
      header: {
        "X-WX-SERVICE": "云服务名称",
        "content-type": "application/json"
      },
      method: method,
      data: data
    }).then(res => {
      // 如果响应成功,解析数据并调用 resolve
      if (res && res.data) {
        resolve(res.data);
      } else {
        reject(new Error("No data returned"));
      }
    }).catch(error => {
      // 如果请求失败,调用 reject
      reject(error);
    });
  });
};
// 创建指定记录的消息
const createNote = (content) => {
  return request(`/notes`, 'POST',{content});
};
// 查看指定记录的消息记录
const getNotes = () => {
  return request(`/notes`, 'GET');
};

module.exports = {
  createNote,
  getNotes
};

image

记录得比较草率,都是在全部操作完之后,重新过来整理的。

微信和小程序系的服务端代码也不需要完全自己写,在服务端接口调试的页面,复制现成的代码生成就行。

https://developers.weixin.qq.com/apiExplorer

image

关于数据库的管理,开放公网访问的话,可以直接用navicat之类的工具,如果不开放公网也可以直接用云托管提供的WEB管理后台,用着感觉也挺不错。

image