微信云托管
官方介绍是微信团队提供的以云原生为基础的,免运维、高可用服务上云解决方案,无需服务器,1分钟即可部署小程序/公众号服务端。
**最重要的是:**与微信生态深度融合,具有免鉴权,云调用,消息推送,微信支付等众多微信优势特性,开发者可以非常轻松和高效的完成互通,
与常规的云服务的区别用一张图表示就是
趁着有需求的机会,开始吧,开葬吧!
前置条件:
- 会使用git
- 了解node服务,express或koa https://expressjs.com/zh-cn/guide/routing.html。或者其它服务端语言
- 对数据库有基本的了解。照着文档可以sequelize操作https://www.sequelize.cn/core-concepts/getting-started
- 会小程序开发
- 习惯用AI的帮助(这个看情况)
前置知识
直接用小程序/公众号的云调用方法,可以直接不需要开启公网访问,而且还会有更多的便利,直接获取openid等用户信息。
服务无需备案,直接可用,不过小程序发布需要备案。
如果需要重新需要处理一个后台,通过公网访问的话,那需要注册域名,备案,绑定。
大概流程
- 注册小程序
- 启用云托管,新建服务(当就可以测试api了)
- 新建自己的仓库(fork官方)
- 更改流水线
- 写API接口代码,提交测试
- 写小程序页面调用代码。
一、注册小程序
自已去
二、启用云托管,新建服务
扫码进入云托管控制台,基于模板新建,前端直接选express或者Koa都行。
结束会有账号的一些相关信息,填写数据库密码,点击完成就行,其它在服务里面可以设置。
点击侧边栏的服务列表,选择你刚刚创建的服务,切换到服务设置里面的环境变量确认是否正确,修改最小实例副本数为:1.默认是0,如果是0的话30分钟没有请求会自动停止。
这时候就可以点击云调调试,访问测试示例模板里面的两个接口了。
对应的就是官方仓库里面的两段代码。
三、新建自己的仓库
然后页面打开到服务列表--部署发布,打开基于模板开发,打开官方模板的github仓库,fork一份到自己的账号下。
修改流水线,测试
啥也不改,然后到云托管后台,服务列表--服务设置--流水线,授权github,填入刚刚fork的仓库,选择分支,推送到分支的时候触发流水线自已看着勾。
git clone 把自己仓库的代码拉到本地,修改'/api/count'改为'/api/number',提交推送到线上,触发流水线自动重新发布。
- `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则返回原来正确的值。
到这里其实就已经可以去小程序里面调用接口了,如果需要其它的接口,打开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中获取"
}
})
正经搞个功能
可以打开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提交推送就行了,流水线是自动重新发布。下面就是在后台在线调试里面测试一下,接口是否可行就行了。
小程序调用
用外网访问的话,可以直接用小程序的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
};
记录得比较草率,都是在全部操作完之后,重新过来整理的。
微信和小程序系的服务端代码也不需要完全自己写,在服务端接口调试的页面,复制现成的代码生成就行。
https://developers.weixin.qq.com/apiExplorer
关于数据库的管理,开放公网访问的话,可以直接用navicat之类的工具,如果不开放公网也可以直接用云托管提供的WEB管理后台,用着感觉也挺不错。