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สไตล์และธีม
TIP

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

#การส่งคำขอ (Request)

NocoBase มี APIClient ที่พัฒนาต่อยอดมาจาก Axios ซึ่งสามารถใช้ส่ง HTTP request ได้จากที่ใดก็ตามที่คุณสามารถเข้าถึง Context ได้ครับ

ตำแหน่งทั่วไปที่คุณสามารถเข้าถึง Context ได้แก่:

  • app.context
  • engine.context
  • plugin.context
  • model.context

#ctx.api.request()

ctx.api.request() เป็นเมธอดที่ใช้ส่งคำขอที่พบบ่อยที่สุดครับ พารามิเตอร์และค่าที่ส่งกลับจะเหมือนกับ axios.request() ทุกประการ

request<T = any, R = AxiosResponse<T>, D = any>(
  config: AxiosRequestConfig<D>,
): Promise<R>;

การใช้งานพื้นฐาน

await ctx.api.request({
  url: 'users:list',
  method: 'get',
});

คุณสามารถใช้การตั้งค่าการส่งคำขอของ Axios มาตรฐานได้โดยตรงเลยครับ:

await ctx.api.request({
  url: 'users:create',
  method: 'post',
  data: {
    name: 'Tao Tao',
  },
});

#ctx.api.axios

ctx.api.axios เป็นอินสแตนซ์ของ AxiosInstance ซึ่งคุณสามารถใช้แก้ไขการตั้งค่าเริ่มต้นแบบ Global หรือเพิ่ม Request Interceptor ได้ครับ

การแก้ไขการตั้งค่าเริ่มต้น

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

สำหรับการตั้งค่าเพิ่มเติม สามารถดูได้ที่ Axios Default Config ครับ

#Request และ Response Interceptor

Interceptor สามารถประมวลผลคำขอก่อนที่จะถูกส่งออกไป หรือประมวลผลการตอบกลับหลังจากที่ได้รับมาแล้วได้ครับ เช่น การเพิ่ม Header ให้กับคำขอทั้งหมด, การแปลงพารามิเตอร์ให้เป็นรูปแบบที่ต้องการ, หรือการแสดงข้อความแจ้งเตือนข้อผิดพลาดแบบรวมศูนย์

#ตัวอย่าง Request Interceptor

// ใช้ qs เพื่อ serialize พารามิเตอร์ params
axios.interceptors.request.use((config) => {
  config.paramsSerializer = (params) =>
    qs.stringify(params, {
      strictNullHandling: true,
      arrayFormat: 'brackets',
    });
  return config;
});

// กำหนด Header ของคำขอเอง
axios.interceptors.request.use((config) => {
  config.headers['Authorization'] = `Bearer token123`;
  config.headers['X-Hostname'] = 'localhost';
  config.headers['X-Timezone'] = '+08:00';
  config.headers['X-Locale'] = 'zh-CN';
  config.headers['X-Role'] = 'admin';
  config.headers['X-Authenticator'] = 'basic';
  config.headers['X-App'] = 'sub1';
  return config;
});

#ตัวอย่าง Response Interceptor

axios.interceptors.response.use(
  (response) => response,
  (error) => {
    // เมื่อเกิดข้อผิดพลาดในการส่งคำขอ ให้แสดงการแจ้งเตือนแบบรวมศูนย์
    ctx.notification.error({
      message: 'เกิดข้อผิดพลาดในการตอบกลับคำขอ',
    });
    return Promise.reject(error);
  },
);

#Custom Request Header ของ NocoBase Server

ด้านล่างนี้คือ Custom Request Header ที่ NocoBase Server รองรับ ซึ่งสามารถนำไปใช้ในสถานการณ์ที่มีหลายแอปพลิเคชัน, การรองรับหลายภาษา (Internationalization), หลายบทบาท (Role) หรือการยืนยันตัวตนหลายรูปแบบได้ครับ

Headerคำอธิบาย
X-Appระบุแอปพลิเคชันที่กำลังเข้าถึงในสถานการณ์ที่มีหลายแอปพลิเคชัน
X-Localeภาษาปัจจุบัน (เช่น zh-CN, en-US)
X-Hostnameชื่อโฮสต์ของ Client
X-Timezoneเขตเวลาของ Client (เช่น +08:00)
X-Roleบทบาทปัจจุบัน
X-Authenticatorวิธีการยืนยันตัวตนของผู้ใช้ปัจจุบัน

💡 เคล็ดลับ
Header เหล่านี้มักจะถูก Interceptor ใส่ให้อัตโนมัติอยู่แล้วครับ ไม่จำเป็นต้องตั้งค่าด้วยตนเอง คุณจะต้องเพิ่มด้วยตนเองในสถานการณ์พิเศษเท่านั้น (เช่น ในสภาพแวดล้อมการทดสอบ หรือสถานการณ์ที่มีหลายอินสแตนซ์)

#การใช้งานใน Component

ใน React Component คุณสามารถเข้าถึง Context Object ได้ผ่าน useFlowContext() แล้วจึงเรียกใช้ ctx.api เพื่อส่งคำขอได้ครับ

import { useFlowContext } from '@nocobase/client';

const MyComponent = () => {
  const ctx = useFlowContext();

  const fetchData = async () => {
    const response = await ctx.api.request({
      url: '/api/posts',
      method: 'get',
    });
    console.log(response.data);
  };

  useEffect(() => {
    fetchData();
  }, []);

  return <div>กำลังโหลด...</div>;
};

#การใช้งานร่วมกับ useRequest ของ ahooks

ในการพัฒนาจริง คุณสามารถใช้ useRequest Hook ที่มาจาก ahooks ร่วมด้วยได้ เพื่อจัดการ Lifecycle และสถานะของคำขอได้อย่างสะดวกยิ่งขึ้นครับ

import { useFlowContext } from '@nocobase/client';
import { useRequest } from 'ahooks';

const MyComponent = () => {
  const ctx = useFlowContext();

  const { data, loading, error, refresh } = useRequest(() =>
    ctx.api.request({
      url: 'posts:list',
      method: 'get',
    }),
  );

  if (loading) return <div>กำลังโหลด...</div>;
  if (error) return <div>เกิดข้อผิดพลาดในการส่งคำขอ: {error.message}</div>;

  return (
    <div>
      <button onClick={refresh}>รีเฟรช</button>
      <pre>{JSON.stringify(data?.data, null, 2)}</pre>
    </div>
  );
};

วิธีนี้จะช่วยให้ Logic ของการส่งคำขอเป็นแบบ Declarative มากขึ้น โดยจะจัดการสถานะการโหลด, การแจ้งเตือนข้อผิดพลาด และ Logic การรีเฟรชให้โดยอัตโนมัติ ซึ่งเหมาะอย่างยิ่งสำหรับการใช้งานใน Component ครับ