Tài liệu
Ví dụ script
Ví dụ script Các ví dụ nhỏ cho handler, hook, flow và script sự kiện websocket. Đọc repository Tìm các dòng const posts = await #post.find({ fields: "id,title", limit: 10 }) Tìm một dòng const result = await #post.find({ filter: { id: { _eq: @PARAMS.id } }, fields: "id,title", li
Ví dụ script
Các ví dụ nhỏ cho handler, hook, flow và script sự kiện websocket.
Đọc repository
Tìm các dòng
const posts = await #post.find({
fields: "id,title",
limit: 10
})
Tìm một dòng
const result = await #post.find({
filter: { id: { _eq: @PARAMS.id } },
fields: "id,title",
limit: 1
})
return result.data[0] || null
Đếm dòng
const result = await #post.find({
fields: "id",
limit: 1,
meta: "totalCount"
})
return result.meta.totalCount
Ghi repository
Tạo dòng
const created = await #post.create({
data: {
title: @BODY.title,
status: "draft"
}
})
return created.data[0]
Cập nhật dòng
const updated = await #post.update({
id: @PARAMS.id,
data: {
title: @BODY.title
}
})
return updated.data[0]
Xóa dòng
await #post.delete({
id: @PARAMS.id
})
return { deleted: true }
Lỗi
Trường body bắt buộc
if ([email protected]) {
@THROW400("Title is required")
}
Thao tác bị cấm
if (!@USER) {
@THROW403("Login required")
}
Không tìm thấy
const row = await #post.find({
filter: { id: { _eq: @PARAMS.id } },
fields: "id",
limit: 1
})
if (!row.data[0]) {
@THROW404("post", @PARAMS.id)
}
Hook
Pre-hook giới hạn theo chủ sở hữu
@QUERY.filter = {
_and: [
@QUERY.filter || {},
{ owner: { id: { _eq: @USER.id } } }
]
}
Pre-hook đặt chủ sở hữu khi tạo
@BODY.owner = { id: @USER.id }
Pre-hook loại bỏ trường phía server
delete @BODY.isAdmin
Post-hook định hình response
return {
id: @DATA.id,
title: @DATA.title
}
Flow
Kích hoạt flow từ handler
await @TRIGGER("send-welcome-email", {
userId: @USER.id
})
return { queued: true }
Bước flow đọc payload
const userId = @FLOW_PAYLOAD.userId
return { userId }
Bước flow dùng bước trước đó
const user = @FLOW.load_user
return {
email: user.email
}
WebSocket
Trả lời client hiện tại
@SOCKET.reply("pong", {
at: new Date().toISOString()
})
Tham gia room
@SOCKET.join(`project:${@BODY.projectId}`)
Emit tới room hiện tại
@SOCKET.emitToCurrentRoom(`project:${@BODY.projectId}`, "project:changed", {
projectId: @BODY.projectId
})
Emit tới người dùng
@SOCKET.emitToUser(@USER.id, "notification", {
title: "Done"
})
Cache
Đặt cache
await @CACHE.set("report:latest", { count: 12 }, 60000)
Lấy cache
const cached = await @CACHE.get("report:latest")
if (cached) return cached