logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
logologo

เริ่มต้นใช้งานฉบับย่อ

ภาพรวมการพัฒนาปลั๊กอิน
การเขียนปลั๊กอินแรกของคุณ
โครงสร้างไดเรกทอรีโปรเจกต์

การพัฒนาฝั่งเซิร์ฟเวอร์

ภาพรวม
ปลั๊กอิน
คอลเลกชัน
การดำเนินการฐานข้อมูล
การจัดการแหล่งข้อมูล
การจัดการทรัพยากร
การควบคุมการเข้าถึง (ACL)
มิดเดิลแวร์
แคช
เหตุการณ์
คอนเท็กซ์คำขอ
สคริปต์การย้ายข้อมูล
ล็อก
การทำให้เป็นสากล (I18n)
คำสั่ง
การจัดการงานที่กำหนดเวลา
การทดสอบ

การพัฒนาฝั่งไคลเอนต์

ภาพรวม
ปลั๊กอิน
คอนเท็กซ์
เราเตอร์
การควบคุมการเข้าถึง (ACL)
การจัดการแหล่งข้อมูล
ทรัพยากร
คำขอ
สไตล์และธีม
ล็อก
การทำให้เป็นสากล (I18n)
การทดสอบ

อื่นๆ

คู่มือการอัปเกรดปลั๊กอิน
รายการภาษา
การจัดการ Dependencies
การสร้าง
Previous Pageการจัดการแหล่งข้อมูล
Next Pageการควบคุมการเข้าถึง (ACL)
TIP

เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ

#ResourceManager การจัดการทรัพยากร

ฟังก์ชันการจัดการทรัพยากรของ NocoBase สามารถแปลงคอลเลกชันและข้อมูลความสัมพันธ์ที่มีอยู่ให้เป็นทรัพยากรได้โดยอัตโนมัติ พร้อมด้วยประเภทการดำเนินการในตัวที่หลากหลาย เพื่อช่วยให้นักพัฒนาสามารถสร้างการดำเนินการทรัพยากร REST API ได้อย่างรวดเร็ว สิ่งที่แตกต่างจาก REST API แบบดั้งเดิมเล็กน้อยคือ การดำเนินการทรัพยากรของ NocoBase ไม่ได้ขึ้นอยู่กับเมธอดการร้องขอ HTTP แต่จะกำหนดการดำเนินการเฉพาะที่จะเรียกใช้ผ่านการระบุ :action อย่างชัดเจนครับ/ค่ะ

#การสร้างทรัพยากรโดยอัตโนมัติ

NocoBase จะแปลง collection และ association ที่กำหนดไว้ในฐานข้อมูลให้เป็นทรัพยากรโดยอัตโนมัติ ตัวอย่างเช่น หากเรากำหนดคอลเลกชัน posts และ tags สองคอลเลกชันดังนี้:

db.defineCollection({
  name: 'posts',
  fields: [
    { type: 'belongsToMany', name: 'tags' },
  ],
});

db.defineCollection({
  name: 'tags',
  fields: [],
});

สิ่งนี้จะสร้างทรัพยากรต่อไปนี้โดยอัตโนมัติ:

  • ทรัพยากร posts
  • ทรัพยากร tags
  • ทรัพยากรความสัมพันธ์ posts.tags

ตัวอย่างการร้องขอ:

เมธอดพาธการดำเนินการ
GET/api/posts:listสอบถามรายการ
GET/api/posts:get/1สอบถามข้อมูลเดี่ยว
POST/api/posts:createเพิ่มใหม่
POST/api/posts:update/1อัปเดต
POST/api/posts:destroy/1ลบ
เมธอดพาธการดำเนินการ
GET/api/tags:listสอบถามรายการ
GET/api/tags:get/1สอบถามข้อมูลเดี่ยว
POST/api/tags:createเพิ่มใหม่
POST/api/tags:update/1อัปเดต
POST/api/tags:destroy/1ลบ
เมธอดพาธการดำเนินการ
GET/api/posts/1/tags:listสอบถามแท็กทั้งหมดที่เชื่อมโยงกับ post
GET/api/posts/1/tags:get/1สอบถามแท็กเดี่ยวภายใต้ post
POST/api/posts/1/tags:createสร้างแท็กเดี่ยวภายใต้ post
POST/api/posts/1/tags:update/1อัปเดตแท็กเดี่ยวภายใต้ post
POST/api/posts/1/tags:destroy/1ลบแท็กเดี่ยวภายใต้ post
POST/api/posts/1/tags:addเพิ่มแท็กที่เชื่อมโยงกับ post
POST/api/posts/1/tags:removeลบแท็กที่เชื่อมโยงออกจาก post
POST/api/posts/1/tags:setกำหนดแท็กที่เชื่อมโยงทั้งหมดสำหรับ post
POST/api/posts/1/tags:toggleสลับการเชื่อมโยงแท็กสำหรับ post
เคล็ดลับ

การดำเนินการทรัพยากรของ NocoBase ไม่ได้ขึ้นอยู่กับเมธอดการร้องขอโดยตรง แต่จะกำหนดการดำเนินการผ่านการระบุ :action อย่างชัดเจนครับ/ค่ะ

#การดำเนินการทรัพยากร

NocoBase มีประเภทการดำเนินการในตัวที่หลากหลาย เพื่อตอบสนองความต้องการทางธุรกิจที่แตกต่างกันครับ/ค่ะ

#การดำเนินการ CRUD พื้นฐาน

ชื่อการดำเนินการคำอธิบายประเภททรัพยากรที่ใช้ได้เมธอดการร้องขอตัวอย่างพาธ
listสอบถามข้อมูลรายการทั้งหมดGET/POST/api/posts:list
getสอบถามข้อมูลเดี่ยวทั้งหมดGET/POST/api/posts:get/1
createสร้างเรคคอร์ดใหม่ทั้งหมดPOST/api/posts:create
updateอัปเดตเรคคอร์ดทั้งหมดPOST/api/posts:update/1
destroyลบเรคคอร์ดทั้งหมดPOST/api/posts:destroy/1
firstOrCreateค้นหาเรคคอร์ดแรก หากไม่มีให้สร้างทั้งหมดPOST/api/users:firstOrCreate
updateOrCreateอัปเดตเรคคอร์ด หากไม่มีให้สร้างทั้งหมดPOST/api/users:updateOrCreate

#การดำเนินการความสัมพันธ์

ชื่อการดำเนินการคำอธิบายประเภทความสัมพันธ์ที่ใช้ได้ตัวอย่างพาธ
addเพิ่มความสัมพันธ์hasMany, belongsToMany/api/posts/1/tags:add
removeลบความสัมพันธ์hasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
setรีเซ็ตความสัมพันธ์hasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggleเพิ่มหรือลบความสัมพันธ์belongsToMany/api/posts/1/tags:toggle

#พารามิเตอร์การดำเนินการ

พารามิเตอร์การดำเนินการที่พบบ่อย ได้แก่:

  • filter: เงื่อนไขการสอบถาม
  • values: ค่าที่จะกำหนด
  • fields: ระบุฟิลด์ที่จะส่งคืน
  • appends: รวมข้อมูลที่เชื่อมโยง
  • except: ยกเว้นฟิลด์
  • sort: กฎการเรียงลำดับ
  • page、pageSize: พารามิเตอร์การแบ่งหน้า
  • paginate: เปิดใช้งานการแบ่งหน้าหรือไม่
  • tree: ส่งคืนโครงสร้างแบบต้นไม้หรือไม่
  • whitelist、blacklist: ไวต์ลิสต์/แบล็กลิสต์ฟิลด์
  • updateAssociationValues: อัปเดตค่าความสัมพันธ์หรือไม่

#การดำเนินการทรัพยากรแบบกำหนดเอง

NocoBase อนุญาตให้ลงทะเบียนการดำเนินการเพิ่มเติมสำหรับทรัพยากรที่มีอยู่ได้ครับ/ค่ะ คุณสามารถใช้ registerActionHandlers เพื่อกำหนดการดำเนินการสำหรับทรัพยากรทั้งหมดหรือทรัพยากรเฉพาะได้

#การลงทะเบียนการดำเนินการแบบ Global

resourceManager.registerActionHandlers({
  customAction: async (ctx) => {
    ctx.body = { resource: ctx.action.resourceName };
  },
});

#การลงทะเบียนการดำเนินการสำหรับทรัพยากรเฉพาะ

resourceManager.registerActionHandlers({
  'posts:publish': async (ctx) => publishPost(ctx),
  'posts.comments:pin': async (ctx) => pinComment(ctx),
});

ตัวอย่างการร้องขอ:

POST /api/posts:customAction
POST /api/posts:publish
POST /api/posts/1/comments:pin

กฎการตั้งชื่อ: resourceName:actionName และใช้ไวยากรณ์แบบจุด (posts.comments) เมื่อมีการรวมความสัมพันธ์ครับ/ค่ะ

#ทรัพยากรแบบกำหนดเอง

หากคุณต้องการจัดหาทรัพยากรที่ไม่เกี่ยวข้องกับคอลเลกชัน คุณสามารถใช้วิธี resourceManager.define เพื่อกำหนดได้ครับ/ค่ะ

resourceManager.define({
  name: 'app',
  actions: {
    getInfo: async (ctx) => {
      ctx.body = { version: 'v1' };
    },
  },
});

เมธอดการร้องขอจะสอดคล้องกับทรัพยากรที่สร้างโดยอัตโนมัติ:

  • GET /api/app:getInfo
  • POST /api/app:getInfo (รองรับทั้ง GET/POST โดยค่าเริ่มต้น)

#Middleware แบบกำหนดเอง

ใช้วิธี resourceManager.use() เพื่อลงทะเบียน middleware แบบ Global ครับ/ค่ะ ตัวอย่างเช่น:

Middleware สำหรับการบันทึก Log แบบ Global

resourceManager.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const duration = Date.now() - start;
  console.log(`${ctx.method} ${ctx.path} - ${duration}ms`);
});

#คุณสมบัติ Context พิเศษ

การที่สามารถเข้าสู่ middleware หรือ action ในเลเยอร์ resourceManager ได้ หมายความว่าทรัพยากรนั้นจะต้องมีอยู่จริงครับ/ค่ะ

#ctx.action

  • ctx.action.actionName: ชื่อการดำเนินการ
  • ctx.action.resourceName: อาจเป็นคอลเลกชันหรือความสัมพันธ์
  • ctx.action.params: พารามิเตอร์การดำเนินการ

#ctx.dataSource

ออบเจกต์แหล่งข้อมูลปัจจุบัน

#ctx.getCurrentRepository()

ออบเจกต์ repository ปัจจุบัน

#วิธีรับออบเจกต์ resourceManager สำหรับแหล่งข้อมูลที่แตกต่างกัน

resourceManager เป็นของแหล่งข้อมูล และสามารถลงทะเบียนการดำเนินการแยกกันสำหรับแหล่งข้อมูลที่แตกต่างกันได้ครับ/ค่ะ

#แหล่งข้อมูลหลัก

สำหรับแหล่งข้อมูลหลัก คุณสามารถใช้ app.resourceManager ได้โดยตรง:

app.resourceManager.registerActionHandlers();

#แหล่งข้อมูลอื่น ๆ

สำหรับแหล่งข้อมูลอื่น ๆ คุณสามารถรับอินสแตนซ์แหล่งข้อมูลเฉพาะผ่าน dataSourceManager และใช้ออบเจกต์ resourceManager ของอินสแตนซ์นั้นเพื่อดำเนินการ:

const dataSource = dataSourceManager.get('external');
dataSource.resourceManager.registerActionHandlers();

#วนซ้ำแหล่งข้อมูลทั้งหมด

หากคุณต้องการดำเนินการเดียวกันกับแหล่งข้อมูลทั้งหมดที่เพิ่มเข้ามา คุณสามารถใช้วิธี dataSourceManager.afterAddDataSource เพื่อวนซ้ำ เพื่อให้แน่ใจว่า resourceManager ของแต่ละแหล่งข้อมูลสามารถลงทะเบียนการดำเนินการที่เกี่ยวข้องได้:

dataSourceManager.afterAddDataSource((dataSource) => {
  dataSource.resourceManager.registerActionHandlers();
});