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

क्विक स्टार्ट

Plugin डेवलपमेंट अवलोकन
अपना पहला Plugin लिखें
प्रोजेक्ट डायरेक्टरी स्ट्रक्चर

सर्वर-साइड डेवलपमेंट

अवलोकन
Plugin
कलेक्शन डेटा टेबल
डेटाबेस ऑपरेशन
DataSourceManager डेटा सोर्स प्रबंधन
ResourceManager रिसोर्स प्रबंधन
ACL परमिशन कंट्रोल
Middleware
Cache
Event
Context रिक्वेस्ट कॉन्टेक्स्ट
माइग्रेशन अपग्रेड स्क्रिप्ट
Logger
Telemetry
I18n इंटरनेशनलाइजेशन
Command लाइन
CronJobManager शेड्यूल्ड टास्क प्रबंधन
Test

क्लाइंट-साइड डेवलपमेंट

अवलोकन
Plugin
Context
Router
ACL परमिशन कंट्रोल
DataSourceManager डेटा सोर्स प्रबंधन
Resource
Request
Styles & Themes
Logger
I18n इंटरनेशनलाइजेशन
Test

अन्य

Plugin अपग्रेड गाइड
भाषा सूची
डिपेंडेंसी प्रबंधन
बिल्ड
Previous PageACL परमिशन कंट्रोल
Next PageCache
TIP

यह दस्तावेज़ AI द्वारा अनुवादित किया गया है। किसी भी अशुद्धि के लिए, कृपया अंग्रेजी संस्करण देखें

#मिडिलवेयर

NocoBase Server का मिडिलवेयर (Middleware) मूल रूप से Koa मिडिलवेयर ही है। आप Koa की तरह ही ctx ऑब्जेक्ट का उपयोग करके अनुरोधों और प्रतिक्रियाओं को संभाल सकते हैं। लेकिन, क्योंकि NocoBase को विभिन्न व्यावसायिक स्तरों के लॉजिक को प्रबंधित करने की आवश्यकता होती है, यदि सभी मिडिलवेयर को एक साथ रखा जाए, तो उन्हें बनाए रखना और प्रबंधित करना बहुत मुश्किल हो जाएगा।

इसी कारण, NocoBase ने मिडिलवेयर को चार स्तरों में विभाजित किया है:

  1. डेटा स्रोत स्तर मिडिलवेयर: app.dataSourceManager.use()
    यह केवल किसी विशिष्ट डेटा स्रोत के अनुरोधों पर लागू होता है। इसका उपयोग आमतौर पर उस डेटा स्रोत के लिए डेटाबेस कनेक्शन, फ़ील्ड सत्यापन या लेनदेन (transaction) प्रोसेसिंग जैसे लॉजिक के लिए किया जाता है।

  2. संसाधन स्तर मिडिलवेयर: app.resourceManager.use()
    यह केवल परिभाषित संसाधनों (Resource) के लिए प्रभावी होता है, और डेटा अनुमतियों (permissions), फ़ॉर्मेटिंग आदि जैसे संसाधन-स्तर के लॉजिक को संभालने के लिए उपयुक्त है।

  3. अनुमति स्तर मिडिलवेयर: app.acl.use()
    यह अनुमति जाँच से पहले निष्पादित होता है, और उपयोगकर्ता की अनुमतियों या भूमिकाओं को सत्यापित करने के लिए उपयोग किया जाता है।

  4. एप्लिकेशन स्तर मिडिलवेयर: app.use()
    यह हर अनुरोध के लिए निष्पादित होता है, और लॉगिंग, सामान्य त्रुटि प्रबंधन (error handling), प्रतिक्रिया (response) प्रबंधन आदि के लिए उपयुक्त है।

#मिडिलवेयर पंजीकरण

मिडिलवेयर आमतौर पर प्लगइन के load मेथड में पंजीकृत किए जाते हैं, उदाहरण के लिए:

export class MyPlugin extends Plugin {
  load() {
    // एप्लिकेशन स्तर मिडिलवेयर
    this.app.use(async (ctx, next) => {
      console.log('App middleware');
      await next();
    });

    // डेटा स्रोत मिडिलवेयर
    this.app.dataSourceManager.use(async (ctx, next) => {
      console.log('DataSource middleware');
      await next();
    });

    // अनुमति मिडिलवेयर
    this.app.acl.use(async (ctx, next) => {
      console.log('ACL middleware');
      await next();
    });

    // संसाधन मिडिलवेयर
    this.app.resourceManager.use(async (ctx, next) => {
      console.log('Resource middleware');
      await next();
    });

  }
}

#निष्पादन क्रम

मिडिलवेयर के निष्पादन का क्रम इस प्रकार है:

  1. सबसे पहले acl.use() द्वारा जोड़े गए अनुमति मिडिलवेयर निष्पादित होते हैं।
  2. फिर resourceManager.use() द्वारा जोड़े गए संसाधन मिडिलवेयर निष्पादित होते हैं।
  3. इसके बाद dataSourceManager.use() द्वारा जोड़े गए डेटा स्रोत मिडिलवेयर निष्पादित होते हैं।
  4. अंत में app.use() द्वारा जोड़े गए एप्लिकेशन मिडिलवेयर निष्पादित होते हैं।

#before / after / tag सम्मिलन तंत्र

मिडिलवेयर के क्रम को अधिक लचीले ढंग से नियंत्रित करने के लिए, NocoBase before, after और tag पैरामीटर प्रदान करता है:

  • tag: मिडिलवेयर को एक टैग दें, जिसका उपयोग बाद के मिडिलवेयर द्वारा संदर्भ के लिए किया जा सके।
  • before: निर्दिष्ट टैग वाले मिडिलवेयर से पहले डालें।
  • after: निर्दिष्ट टैग वाले मिडिलवेयर के बाद डालें।

उदाहरण:

// सामान्य मिडिलवेयर
app.use(m1, { tag: 'restApi' });
app.resourceManager.use(m2, { tag: 'parseToken' });
app.resourceManager.use(m3, { tag: 'checkRole' });

// m4, m1 से पहले रखा जाएगा
app.use(m4, { before: 'restApi' });

// m5, m2 और m3 के बीच डाला जाएगा
app.resourceManager.use(m5, { after: 'parseToken', before: 'checkRole' });
TIP

यदि कोई स्थिति निर्दिष्ट नहीं की जाती है, तो नए जोड़े गए मिडिलवेयर का डिफ़ॉल्ट निष्पादन क्रम इस प्रकार होगा:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()

#ओनियन मॉडल उदाहरण

मिडिलवेयर का निष्पादन क्रम Koa के ओनियन मॉडल (Onion Model) का पालन करता है, जिसका अर्थ है कि यह पहले मिडिलवेयर स्टैक में प्रवेश करता है और अंत में बाहर निकलता है।

app.use(async (ctx, next) => {
  ctx.body = ctx.body || [];
  ctx.body.push(1);
  await next();
  ctx.body.push(2);
});

app.resourceManager.use(async (ctx, next) => {
  ctx.body = ctx.body || [];
  ctx.body.push(3);
  await next();
  ctx.body.push(4);
});

app.acl.use(async (ctx, next) => {
  ctx.body = ctx.body || [];
  ctx.body.push(5);
  await next();
  ctx.body.push(6);
});

app.resourceManager.define({
  name: 'test',
  actions: {
    async list(ctx, next) {
      ctx.body = ctx.body || [];
      ctx.body.push(7);
      await next();
      ctx.body.push(8);
    },
  },
});

विभिन्न इंटरफेस तक पहुँचने पर, आउटपुट क्रम के उदाहरण:

  • सामान्य अनुरोध: /api/hello
    आउटपुट: [1,2] (संसाधन परिभाषित नहीं है, resourceManager और acl मिडिलवेयर निष्पादित नहीं होते हैं)

  • संसाधन अनुरोध: /api/test:list
    आउटपुट: [5,3,7,1,2,8,4,6]
    मिडिलवेयर स्तर के क्रम और ओनियन मॉडल के अनुसार निष्पादित होते हैं।

#सारांश

  • NocoBase मिडिलवेयर, Koa मिडिलवेयर का एक विस्तार है।
  • चार स्तर: एप्लिकेशन -> डेटा स्रोत -> संसाधन -> अनुमति
  • आप निष्पादन क्रम को लचीले ढंग से नियंत्रित करने के लिए before / after / tag का उपयोग कर सकते हैं।
  • Koa ओनियन मॉडल का पालन करता है, जो मिडिलवेयर को कंपोजेबल और नेस्टेबल (composable and nestable) बनाता है।
  • डेटा स्रोत स्तर मिडिलवेयर केवल निर्दिष्ट डेटा स्रोत अनुरोधों पर लागू होता है, जबकि संसाधन स्तर मिडिलवेयर केवल परिभाषित संसाधन अनुरोधों पर लागू होता है।