在文档出来之前,可能会发现Laf好像不支持WebSocket,但是聪明的Laf团队隐藏了一个云函数,这个云函数并不会用完即销毁,会一直存在。专为WebSocket存在的云函数!!
1、新建云函数,命名为:__websocket__
2、替换云函数__websocket__
的代码
import cloud from '@lafjs/cloud'
export async function main(ctx: FunctionContext) {
let wsMap = await cloud.shared.get("wsMap")
if(!wsMap){
wsMap = new Map()
await cloud.shared.set("wsMap", wsMap)
}
if (ctx.method === "WebSocket:connection") {
const userId = generateUserId()
wsMap = await cloud.shared.get("wsMap")
wsMap.set(userId, ctx.socket);
await cloud.shared.set("wsMap", wsMap)
ctx.socket.send("连接成功,你的userID是:"+userId);
}
if (ctx.method === "WebSocket:message") {
const { data } = ctx.params;
console.log("接收到的信息:",data.toString());
const userId = getKeyByValue(wsMap, ctx.socket);
ctx.socket.send("服务端已接收到消息事件,你的userID是:"+userId);
}
if (ctx.method === "WebSocket:close") {
wsMap = await cloud.shared.get("wsMap")
const userId = getKeyByValue(wsMap, ctx.socket);
wsMap.delete(userId);
await cloud.shared.set("wsMap", wsMap)
ctx.socket.send("服务端已接收到关闭事件消息,你的userID是:"+userId);
}
}
function generateUserId() {
return Math.random().toString(36).substring(2, 15);
}
function getKeyByValue(map, value) {
for (const [key, val] of map.entries()) {
if (val === value) {
return key;
}
}
}
3、发布云函数并获取wss链接
获得的链接 为 https://<应用appid>.laf.dev/__websocket__
手动把https改成wss,得到wss://<应用appid>.laf.dev/__websocket__
4、测试多用户
任意找一个在线测试的网站,如:https://www.hake.cc/tools/websocket/
多开几个在线测试的网站,分别连接该WebSocket,即可测试多用户连接的情况了
5、通过userID发推送消息
新建一个测试云函数,如:testWss
代码如下:
import cloud from '@lafjs/cloud'
export async function main(ctx: FunctionContext) {
let wsMap = await cloud.shared.get("wsMap")
ctx.socket = wsMap.get("l6qs9hieh9p")
ctx.socket.send("消息测试");
}
按照图片测试:
总结:简单的WebSocket示例,可以结合数据库去保存,方法类似,其他更多用法可自行拓展