Просмотр исходного кода

fix: wrap cloud function business params

彭峰 1 месяц назад
Родитель
Сommit
c662ca0168

+ 1 - 0
docs/migration/wxapp-cloud-action-matrix.md

@@ -4,6 +4,7 @@
 
 - 基线来自旧 uni-app 源码静态扫描生成的 `SOURCE_API_ACTIONS`,共 91 个唯一 action。
 - 统一新入口为 `POST /api/functions/xiaoshu/app/gateway`。
+- 请求体统一使用 `{ "token": "<sessionToken>", "params": { "action": "...", ... } }`;执行器会占用顶层 `id`,业务参数不得放在顶层。公开接口可省略 `token`,但仍必须保留 `params`。
 - 已有云函数映射 26 个,另有 65 个以 HTTP 501 和 `migration_blocked: <原因>` 显式拒绝。矩阵不存在未知 action。
 - “已映射”表示已有云函数代码与权限边界;完成 H5 切换前仍需逐页响应字段回归。
 

+ 2 - 0
docs/schema/functions-function.md

@@ -27,6 +27,8 @@ class Function {
 
 当前执行器版本 `2.0.0` 的全局通配路由按不带前导 `/` 的字符串精确匹配 `Function.path`。因此记录保存为 `xiaoshu/admin/gateway`,HTTP 调用仍使用 `/api/functions/xiaoshu/admin/gateway`。这是对线上执行器行为的兼容,部署脚本会校验这一约束。
 
+执行器还会占用请求体顶层 `id`。所有业务参数必须放入 `params`,即 `{ token?, params: { action/operation, id, ... } }`;否则带 `id` 的详情接口会在进入 handler 前返回 `Object not found`。
+
 已部署函数:
 
 | Function.name | path | 用途 |

+ 1 - 1
scripts/deploy-admin-functions.mjs

@@ -369,7 +369,7 @@ async function upsert(definition) {
     respType: 'json',
     respJson: { success: true, data: {} },
     enabled: true,
-    version: '1.0.6',
+    version: '1.0.8',
   };
   const objectId = existing.results?.[0]?.objectId;
   if (objectId) {

+ 3 - 1
scripts/smoke-admin-functions.mjs

@@ -41,7 +41,7 @@ async function callLegacyFunction(token, params, expectedStatus = 200) {
   const response = await fetch(`${FUNCTION_URL}/xiaoshu/app/gateway`, {
     method: 'POST',
     headers: { 'X-Parse-Application-Id': APP_ID, 'Content-Type': 'application/json' },
-    body: JSON.stringify(token ? { token, params } : params),
+    body: JSON.stringify({ ...(token ? { token } : {}), params }),
   });
   const payload = await response.json().catch(() => ({}));
   if (response.status !== expectedStatus) throw new Error(`app gateway ${params.action} 期望 ${expectedStatus},实际 ${response.status}: ${payload.retmsg || payload.error || ''}`);
@@ -106,6 +106,8 @@ try {
   if (!Array.isArray(content.result) || content.result.length !== 2 || Number(content.page?.itemCount) < 90000) throw new Error('公开内容分页校验失败');
   const contentExact = await callLegacyFunction('', { action: 'content_list', page: 1, pageSize: 1, objectId: content.result[0].objectId });
   if (contentExact.result?.[0]?.objectId !== content.result[0].objectId || contentExact.page?.itemCount !== 1) throw new Error('内容 objectId 精确查询校验失败');
+  const contentDetail = await callLegacyFunction('', { action: 'content_get', id: content.result[0].objectId });
+  if (contentDetail.result?.objectId !== content.result[0].objectId) throw new Error('内容详情 ID 校验失败');
 
   const profile = await callLegacyFunction(login.sessionToken, { action: 'user_get' });
   if (profile.retcode !== 0 || profile.result?.objectId !== userId) throw new Error('app gateway 用户会话校验失败');