
Laf 快速上手用云函数 云数据库实现用户注册/登录【免费下载链接】lafLaf is a vibrant cloud development platform that provides essential tools like cloud functions, databases, and storage solutions. It enables developers to quickly unleash their creativity and bring innovative ideas to life with ease.项目地址: https://gitcode.com/GitHub_Trending/la/laf本文基于 Laf 官方快速开始教程带你用约 5 分钟在 Laf 云开发平台上完成一个「用户注册/登录」功能的开发编写register、login两个云函数用云数据库存储用户信息用内置 JWT 能力签发访问令牌并展示 curl 与前端 HTTP 请求两种调用方式。读完本文你将掌握 Laf 云函数的编写、发布、调用全流程并理解cloud.mongo、cloud.getToken等 API 在运行时中的真实实现位置。环境准备创建应用按 docs/zh/quick-start/login.md 的原始步骤在 Laf 平台laf.run注册一个账户在 Laf 控制台点击左上角「新建」按钮创建一个新应用待应用成功启动后点击右侧「开发」按钮进入应用的「开发控制台」。后续的函数开发都在「开发控制台」中进行。编写用户注册云函数register在「云函数」管理页面点击「新建函数」创建函数register点击进入 WebIDE 编写以下代码与官方教程一致import cloud from lafjs/cloud; import { createHash } from crypto; const db cloud.mongo.db export default async function (ctx: FunctionContext) { const username ctx.body?.username || ; const password ctx.body?.password || ; // check param if (!/^[a-zA-Z0-9]{3,16}$/.test(username)) return { error: invalid username }; if (!/^[a-zA-Z0-9]{3,16}$/.test(password)) return { error: invalid password }; // check username existed const exists await db .collection(users) .countDocuments({ username: username }) if (exists 0) return { error: username already existed }; // add user const res await db.collection(users).insertOne({ username: username, password: createHash(sha256).update(password).digest(hex), created_at: new Date(), }); console.log(user registered: , res.insertedId); return { data: res.insertedId }; };这段代码的完整流程是参数校验用户名/密码均为 316 位字母数字→ 用countDocuments检查用户名是否已存在 → 将密码做 SHA-256 哈希后insertOne写入users集合 → 返回新建文档的insertedId。从源码结构看cloud.mongo并非一个空壳在 Node.js 运行时中createCloudSdk会把DatabaseAgent持有的数据库连接注入 SDK 实例见 runtimes/nodejs/src/support/cloud-sdk.tsconst cloud: CloudSdkInterface { database: () getDb(DatabaseAgent.accessor), invoke: invokeInFunction, shared: _shared_preference, getToken: getToken, parseToken: parseToken, mongo: { client: DatabaseAgent.client as any, db: DatabaseAgent.db as any, }, // ... }也就是说cloud.mongo.db是 Laf 为当前应用分配的云数据库实例兼容 MongoDB 驱动接口db.collection(users)上的countDocuments、insertOne、findOne等就是标准的集合操作。SDK 侧的封装类见 packages/cloud-sdk/src/cloud.ts其中mongo以 getter 形式代理到运行时实现业务代码只需import cloud from lafjs/cloud即可无需关心底层连接细节。编辑完成后点击 WebIDE 右上角的「发布」按钮函数即发布上线。编写用户登录云函数login同样新建login云函数编写以下代码import cloud from lafjs/cloud; import { createHash } from crypto; const db cloud.mongo.db export default async function (ctx: FunctionContext) { const username ctx.body?.username || const password ctx.body?.password || // check user login const user await db .collection(users) .findOne({ username: username, password: createHash(sha256).update(password).digest(hex), }) if (!user) return { error: invalid username or password }; // generate jwt token const user_id user._id; const payload { uid: user_id, exp: Math.floor(Date.now() / 1000) 60 * 60 * 24 * 7, }; const access_token cloud.getToken(payload); return { uid: user_id, access_token: access_token, }; };登录逻辑用「用户名 密码 SHA-256 哈希」作为查询条件findOne命中即成功随后构造payloaduid为用户文档_idexp为 7 天后的 Unix 秒级时间戳即令牌有效期调用cloud.getToken(payload)签发 JWT并把uid与access_token一并返回给客户端。发布方式同上点击右上角「发布」即可。源码级印证getToken如何签发 JWTcloud.getToken的实际实现在 runtimes/nodejs/src/support/token.tsexport function getToken(payload: any, secret?: string): string { return jwt.sign(payload, secret ?? Config.SERVER_SECRET) }底层使用jsonwebtoken库签名密钥默认取运行时的Config.SERVER_SECRET每个应用独立业务代码无需自行管理密钥。对应的验签函数parseTokentoken.ts#L26-L34在 token 缺失或校验失败时返回null这一点对后续鉴权写法很关键。后续云函数如何校验登录身份Bearer TokenLaf 云函数内置了Bearer Token身份验证客户端在请求头中携带Authorization: Bearer ${jwt}运行时会在中间件中解析它见 runtimes/nodejs/src/index.tsapp.use(function (req, res, next) { const token splitBearerToken(req.headers[authorization] ?? ) const auth parseToken(token) || null req[user] auth // ... next() })解析结果挂到req[user]上并传入函数上下文因此在任意云函数中可以直接读取ctx.user获得login中写入的payload即uid。若请求未携带Authorization头、格式不是Bearer ${jwt}或 token 验签不通过ctx.user为null。完整的生成/验证 JWT 示例可继续阅读 docs/zh/cloud-function/auth.md。调用云函数函数发布后Laf 会为应用分配独立的调用域名路径即函数名。使用 curl 调用在函数详情页右上方可复制云函数的调用地址也可将下面的命令中APPID替换为自己的 APPID 后执行# 注册用户 curl -X POST -H Content-Type: application/json -d {username: admin, password: admin} https://APPID.laf.run/register # 用户登录 curl -X POST -H Content-Type: application/json -d {username: admin, password: admin} https://APPID.laf.run/login在前端项目中用 HTTP 请求调用在 Vue/React/Angular/小程序等任意前端工程中都可以直接通过 HTTP 调用这两个函数import axios from axios const baseUrl https://APPID.laf.run // register async function register(username, password) { try { const response await axios.post(baseUrl /register, { username: username, password: password }); console.log(response); } catch (error) { console.error(error); } } // login async function login(username, password) { try { const response await axios.post(baseUrl /login, { username: username, password: password }) console.log(response) } catch (error) { console.error(error) } }为什么「路径即函数名」从源码结构看Node.js 运行时的 Express 应用注册了一个通配路由runtimes/nodejs/src/handler/router.tsrouter.all(*, uploader.any(), (req, res) { let func_name req.path // remove the leading slash if (func_name.startsWith(/)) { func_name func_name.slice(1) } // ... req.params[name] func_name handleInvokeFunction(req, res) })即请求路径去掉开头的/后直接作为函数名交给handleInvokeFunction执行。这解释了为何https://APPID.laf.run/login会命中login函数同时uploader.any()multer的接入也让同一入口天然支持文件上传场景ctx.body承载 JSON 请求体文件则进入上传队列。实践注意点密码存储本教程使用 SHA-256 摘要做密码哈希是最小可用的演示方案。crypto模块本身提供加盐哈希、时序安全比较等更完整的原语生产环境可按需加强。令牌有效期exp写在 payload 中示例为 7 天JWT 到期后parseToken验签会失败ctx.user变为null客户端应引导用户重新登录。SDK 弃用提示从 packages/cloud-sdk/src/cloud.ts 的注释可见cloud.fetchAxios 实例与cloud.invoke均已标记 deprecated前者建议直接使用全局fetch()后者建议直接 import 函数模块调用cloud.env也建议改用process.env。数据库连接就绪运行时通过DatabaseAgent.ready在连接建立后才填充cloud.mongo对象见 cloud-sdk.ts#L46-L49健康检查接口/_/healthz会返回 503 直到数据库就绪可用作发布后的探活手段。下一步完成注册/登录后可沿着官方文档体系继续深入云函数docs/zh/cloud-function/index.md云数据库docs/zh/cloud-database/index.md云存储docs/zh/cloud-storage/index.md【免费下载链接】lafLaf is a vibrant cloud development platform that provides essential tools like cloud functions, databases, and storage solutions. It enables developers to quickly unleash their creativity and bring innovative ideas to life with ease.项目地址: https://gitcode.com/GitHub_Trending/la/laf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考