服务端函数
Server Function 怎样从客户端触发服务端操作?
- 远端调用: 框架把服务端函数引用转换成客户端可调用的入口,调用跨网络执行,参数与返回值需按协议序列化;
- 异步契约: 用 async 函数表达远端执行,适合提交或修改服务端状态,不把它当作同步本地函数;
- Action 关系: 在 Action 中使用的 Server Function 属于服务端 Action 场景,但 Server Function 与 Action 不是完全相同的概念;
如何把服务端函数接入表单?
- 模块声明: 文件顶部使用 'use server',导出可从客户端引用的异步函数,细节见边界指令;
- 表单载荷: action 接收 FormData,不能把表单示例写成接收普通字符串却不提取字段;
"use server";
export async function updateName(formData) {
const user = await requireCurrentUser();
const name = String(formData.get("name") ?? "").trim();
if (!name) throw new Error("姓名不能为空");
await database.users.update(user.id, { name });
}
import { updateName } from "./actions.js";
const form = (
<form action={updateName}>
<input name="name" required />
<button>保存</button>
</form>
);
服务端函数为什么仍然需要鉴权与校验?
- 不可信输入: 客户端可以构造任意参数,隐藏按钮、闭包捕获或使用服务端文件都不构成授权;
- 每次校验: 在函数内部确认当前用户、操作对象权限与参数类型,避免信任传入的用户 ID;
- 输出控制: 只返回客户端需要且允许公开的数据,不把完整数据库对象或敏感字段直接序列化;