1. 云函数
ShangCloud
  • ShangCloud简介
  • 立项一周年庆祝
  • v3
    • V3设计理念
    • 扩展使用教程
    • 数据导出
    • 云变量
      • 用户变量操作 (读/写/删)
    • 云函数
      • 整体概述
      • 使用指南
      • 调用主节点云函数
        POST
    • 社区作品ID获取教程
      • 40code
      • ZeroCat (Moonrend)
      • CCW(共创世界)
      • AstraEditor & 02engine & Bilup
    • OAuth
      • 设备授权登录
      • 获取或刷新 AccessToken
    • MMO联机
      • 说明
      • TCP/UDP协议联机
      • 创建房间
      • 加入已有房间
      • 设置房间配置
      • 设置房间额外数据(键值对)
      • 获取房间所有额外数据
      • 删除房间额外数据中的指定键
      • 强制踢出房间内指定用户
      • 查询指定房间的当前人数
    • 即时通讯
      • 会话
        • 获取会话列表
        • 获取会话详情
        • 获取当前会话成员
      • 消息
        • 获取历史消息
        • 发送文本消息或回复
        • 获取历史消息(兼容路径)
        • 回复指定消息
        • 编辑文本消息
        • 仅为自己删除消息
        • 撤回消息
      • 已读状态
        • 获取自己的已读状态
        • 推进自己的已读位置
        • 获取自己的已读状态(兼容路径)
        • 推进自己的已读位置(兼容路径)
      • 同步
        • 增量同步会话和消息变化
    • 娱乐功能
      • 随机图
    • 扩展API
      • QQ消息推送
      • 群推送接口
      • IP查询
    • Q&A
      • 40code作品绑定教程
      • ZeroCat作品绑定教程
      • 时间同步
      • 未绑定作品
      • AstraEditor & 02engine & Bilup
    • 健康监控
      • 平台存活状态
      • MMO 系统状态
      • 平台统计数据
  • v2
    • v2
    • 账号操作
      • 登陆
      • 获取用户信息
      • 绑定40code账户
    • 数据库部分
      • 新建数据库
      • 删除数据库
      • 读取数据库
      • 写入数据库
      • 获取数据库列表
      • 重置数据库
    • 状态获取
      • 服务器总占用
  • v1
    • v1
    • 账号操作
      • 管理员
        • 创建新用户
        • 删除用户
        • 设置管理员
        • 获取用户列表
        • 封禁用户
        • 解封用户
      • 普通用户
        • 登录
        • 更改密码
      • 游客
        • 获取用户状态
        • 注册
    • API部分
      • 获取时间戳
      • 获取版本号
      • 邮件验证码
      • 发送HTTP请求
    • 数据库部分
      • 新建数据库
      • 删除数据库
      • 读取数据库
      • 写入数据库
      • 更改数据库权限
      • 获取数据库列表
    • MySQL接口
    • 服务器状态
      • 获取CPU占用
      • 获取总内存
      • 获取使用中内存
      • 获取指定硬盘总容量
      • 获取指定硬盘使用容量
      • 获取内存占用率
      • 获取指定硬盘占用率
      • 设置风扇转速
      • 设置风扇为手动模式
      • 服务器总状态
  • MMO
    • 接入文档
    • 加入MMO房间
    • 创建MMO房间
  • 所有操作
    GET
  • 数据模型
    • Schemas
      • AccessTokenInvalid
      • SuccessResponse
      • BadResponse
      • NoPowerResponse
      • NotFoundResponse
      • ServerErrorResponse
    • 极验数据
    • RoomResult
    • VariableResponse
    • StatusResponse
    • ErrorResponse
    • InvokeSuccess
    • Error
    • MmoStatsResponse
    • UserSummary
    • SuccessStatusResponse
    • PlatformStatsResponse
    • ConversationMember
    • AppTitle
    • Attachment
    • ReplyReference
    • Message
    • Conversation
    • ConversationSummary
    • ChangedConversation
    • CursorPair
    • MessageCursorMap
    • PairCursorMap
    • SendMessageRequest
    • ReplyMessageRequest
    • EditMessageRequest
    • UpdateReadStateRequest
    • SyncRequest
    • ConversationListData
    • MemberListData
    • HistoryData
    • ReadStateData
    • DeleteMessageData
    • RecallMessageData
    • SyncData
    • ConversationListResponse
    • ConversationResponse
    • MemberListResponse
    • HistoryResponse
    • ReadStateResponse
    • MessageResponse
    • DeleteMessageResponse
    • RecallMessageResponse
    • SyncResponse
    • SuccessEnvelope
  1. 云函数

使用指南

云函数允许你使用 JavaScript 在服务端处理游戏逻辑、读写云变量和数据表,以及响应
多人联机房间事件。代码在服务端运行,不需要由玩家设备执行。

云函数类型#

ShangCloud 提供两种云函数:
类型适用场景特点
主节点函数数据查询、变量计算、调用外部接口、处理事件系统动作内置接口同步返回结果,可以将计算结果返回给调用方
边缘节点函数房间消息拦截、成员进出、房间广播、实时互动在多人联机房间中执行,应尽快完成;大部分写操作只负责提交,不返回最终处理结果
需要查询数据并根据结果继续处理时,请使用主节点函数;需要处理实时房间事件时,请使用
边缘节点函数。

创建云函数#

进入开发者中心,选择目标应用并打开“云函数”页面,然后创建函数。
创建时需要填写:
函数名称:只能包含英文字母、数字和下划线,不能以数字开头;
运行节点:选择主节点或边缘节点;
触发器:决定函数在什么时候运行;
入口函数:通常使用 main;
代码:服务端 JavaScript 源码;
启用状态:关闭后不会接受新的调用。
主节点函数保存后可以在页面中试运行。边缘节点函数需要通过多人联机房间事件触发,运行
结果和 console 输出可在“运行日志”中查看。

基本结构#

入口函数接收 ctx 和 payload 两个参数:

ctx 调用上下文#

常用字段如下:
字段说明
ctx.app当前应用
ctx.fn当前函数名称
ctx.trigger本次调用的触发器
ctx.uid当前玩家 UID;没有关联玩家时可能为空
ctx.nickname当前玩家昵称,仅部分房间触发器提供
ctx.room当前房间,仅边缘节点房间触发器提供
ctx.now本次调用的时间戳
使用玩家私有数据前,建议先检查 ctx.uid:

payload 调用参数#

payload 是字符串。如果调用方传入 JSON,需要在函数中自行解析:
如果参数不一定是合法 JSON,可以使用 try/catch:

返回值#

可以返回字符串、数字、布尔值、数组或对象:
主节点函数的返回值会返回给调用方。边缘节点函数的返回值是否生效,取决于所使用的
触发器。

控制台日志#

云函数支持以下日志方法:
日志可在云函数页面的“运行日志”中查看。建议记录必要的标识和处理结果,不要在日志中
输出访问令牌、密码或其他敏感信息。

主节点函数#

主节点函数适合需要读取结果、执行数据计算或调用外部接口的场景。

云变量#

云变量分为应用级变量和玩家私有变量,两者是相互独立的。
类型读取写入删除
应用级变量kv.get(key)kv.set(key, value)kv.delete(key)
玩家私有变量kv.getUser(uid, key)kv.setUser(uid, key, value)kv.deleteUser(uid, key)

应用级变量#

应用级变量由当前应用的所有玩家共享,适合保存公告、公共配置或全局状态:

玩家私有变量#

玩家私有变量按 UID 隔离,适合保存等级、金币、背包和个人进度:
请特别注意:
即使 ctx.uid 存在,kv.get() 也不会自动读取当前玩家的数据。

数值变量#

云变量值按字符串使用。参与计算前应显式转换,写回时再转换为字符串:

应用数据表#

主节点函数可以查询和修改当前应用的数据表:
查询示例:
写入示例:
使用前请先在开发者中心创建对应的数据表和字段。字段名称、数据类型以及数据访问规则
必须与表配置一致。

HTTP 请求#

主节点函数可以向允许访问的外部地址发送 HTTP 请求:
示例:
外部地址可能受到安全策略限制。请求失败时会抛出异常,可以使用 try/catch 处理:

通过事件系统调用主节点函数#

事件系统可以把“变量变化”等事件交给主节点云函数处理。
配置步骤:
1.
在事件系统中创建事件模板;
2.
创建“触发云函数”动作并选择目标主节点函数;
3.
如需将事件字段传给函数,开启“合并当前上下文”;
4.
创建规则并关联该动作。

变量变化事件参数#

假设玩家私有变量 level 从 80 更新为 90,开启“合并当前上下文”后,函数收到的
payload 类似:
{
  "level": "90",
  "variable_name": "level",
  "old_value": "80",
  "new_value": "90",
  "delta": 10.0,
  "write_source": "external"
}
字段说明:
字段说明
variable_name发生变化的变量名
old_value写入前的值
new_value写入后的值
delta数值变化量;非数值变量可能为空
write_source本次写入的来源
这些字段是本次事件的上下文,不是持久化云变量,应从 payload 中读取:
如果需要重新读取触发事件的玩家当前数据,应使用玩家私有变量接口:
如果没有开启“合并当前上下文”,payload 只包含动作中手动填写的参数。

示例:等级提升后发放金币#

边缘节点函数#

边缘节点函数用于处理多人联机房间中的实时事件。

触发器#

触发器说明
room_create房间创建
room_destroy房间销毁
room_join玩家加入房间
room_leave玩家离开房间
message收到房间消息,广播前触发
call客户端主动调用房间函数
tick按设置的间隔定时触发

房间接口#

成员加入时发送通知:

消息拦截#

message 触发器会在消息广播前执行。返回值具有以下含义:
返回值效果
false拦截消息,不再广播
字符串使用返回的字符串替换原消息
其他值放行原消息
示例:

边缘节点的数据写入#

边缘节点函数可以提交应用级变量、玩家私有变量和数据表写入:
这些操作主要用于提交写入请求,不应依赖其返回值继续执行查询或计算。需要先读取数据再
决定如何处理时,应调用主节点函数。
边缘节点函数应保持简短,避免复杂循环、大量日志或耗时操作,以免影响房间消息处理。

在作品中调用#

Scratch 扩展提供两类调用积木:
调用云函数:调用主节点函数,适合业务计算并等待返回结果;
调用房间云函数:调用当前多人联机房间中的边缘节点函数,需要先加入房间。
传入对象时,请先将参数转换成 JSON 字符串,例如:
{"score": 100, "mode": "ranked"}
函数返回对象时,调用方通常会收到 JSON 字符串,可根据作品端能力继续解析。

错误处理建议#

检查玩家 UID#

检查 JSON 参数#

检查数值#

处理内置接口异常#

常见问题#

kv.get("level") 为什么是空的?#

kv.get() 读取应用级变量。如果 level 是玩家私有变量,应使用:

事件参数中有 level,为什么云变量读取不到?#

事件参数和持久化云变量是两个不同概念:

为什么事件函数的 payload 没有 new_value?#

请检查“触发云函数”动作是否开启了“合并当前上下文”。未开启时,函数只会收到动作中
手动配置的参数。

为什么测试时读不到线上玩家数据?#

开发者中心的部分测试功能会使用隔离的测试玩家数据,避免调试操作影响真实玩家。请在
实际玩家调用或真实事件触发后查看对应结果。

为什么边缘节点写入后不能立即读取结果?#

边缘节点函数面向实时房间事件,数据写入主要用于提交操作。需要读取写入结果或执行连续
的数据处理时,请改用主节点函数。

如何排查函数没有执行?#

依次检查:
1.
函数是否已保存并启用;
2.
函数类型和触发器是否正确;
3.
事件模板、规则和动作是否启用;
4.
事件动作是否选择了正确的函数;
5.
参数是否为有效 JSON;
6.
“运行日志”中是否记录了异常;
7.
玩家私有变量是否使用了 kv.getUser(),并且 ctx.uid 有值。

最佳实践#

主节点函数负责数据查询、业务计算和需要结果的操作;
边缘节点函数负责简短的实时房间逻辑;
应用公共数据使用 kv.get(),玩家数据使用 kv.getUser();
对所有外部参数进行类型和范围检查;
对 JSON 解析、数据表操作和 HTTP 请求进行异常处理;
不在日志或返回值中暴露访问令牌、密码等敏感数据;
避免在边缘节点函数中执行复杂循环或产生大量日志;
对金币、结算分数等重要变量,配合内容守护限制客户端直接写入;
保存函数后先使用测试功能验证,再接入正式事件或作品流程。
修改于 2026-08-04 13:41:56
上一页
整体概述
下一页
调用主节点云函数
Built with