मराठी

Next.js मिडलवेअर, येणाऱ्या रिक्वेस्ट्समध्ये हस्तक्षेप करून त्या बदलण्यासाठी एक शक्तिशाली वैशिष्ट्य आहे. व्यावहारिक उदाहरणांसह प्रमाणीकरण, अधिकृतता, पुनर्निर्देशन आणि A/B चाचणी कशी लागू करावी ते शिका.

Next.js मिडलवेअर: डायनॅमिक ऍप्लिकेशन्ससाठी रिक्वेस्ट इंटरसेप्शनमध्ये प्रभुत्व मिळवणे

Next.js मिडलवेअर तुमच्या रूट्सपर्यंत पोहोचण्यापूर्वी येणाऱ्या रिक्वेस्ट्समध्ये हस्तक्षेप करण्यासाठी आणि त्या बदलण्यासाठी एक लवचिक आणि शक्तिशाली मार्ग प्रदान करते. ही क्षमता तुम्हाला प्रमाणीकरण आणि अधिकृततेपासून ते पुनर्निर्देशन आणि A/B चाचणीपर्यंत अनेक वैशिष्ट्ये लागू करण्यास सक्षम करते, आणि हे सर्व करताना कार्यप्रदर्शन ऑप्टिमाइझ करते. हे सर्वसमावेशक मार्गदर्शक तुम्हाला Next.js मिडलवेअरच्या मुख्य संकल्पनांबद्दल माहिती देईल आणि त्याचा प्रभावीपणे कसा वापर करायचा हे दाखवेल.

Next.js मिडलवेअर म्हणजे काय?

Next.js मधील मिडलवेअर हे एक फंक्शन आहे जे रिक्वेस्ट पूर्ण होण्यापूर्वी चालते. ते तुम्हाला खालील गोष्टी करण्याची परवानगी देते:

मिडलवेअर फंक्शन्स तुमच्या प्रोजेक्टच्या रूट डिरेक्टरीमधील middleware.ts (किंवा middleware.js) फाईलमध्ये परिभाषित केले जातात. ते तुमच्या ऍप्लिकेशनमधील प्रत्येक रूटसाठी किंवा कॉन्फिगर करण्यायोग्य मॅचर्सवर आधारित विशिष्ट रूट्ससाठी कार्यान्वित केले जातात.

मुख्य संकल्पना आणि फायदे

रिक्वेस्ट ऑब्जेक्ट (Request Object)

request ऑब्जेक्ट येणाऱ्या रिक्वेस्टबद्दल माहिती पुरवतो, ज्यात खालील गोष्टींचा समावेश आहे:

रिस्पॉन्स ऑब्जेक्ट (Response Object)

मिडलवेअर फंक्शन्स रिक्वेस्टच्या परिणामावर नियंत्रण ठेवण्यासाठी Response ऑब्जेक्ट परत करतात. तुम्ही खालील रिस्पॉन्स वापरू शकता:

मॅचर्स (Matchers)

मॅचर्स तुम्हाला हे निर्दिष्ट करण्याची परवानगी देतात की तुमचे मिडलवेअर कोणत्या रूट्सवर लागू केले पाहिजे. तुम्ही रेग्युलर एक्सप्रेशन्स किंवा पाथ पॅटर्न्स वापरून मॅचर्स परिभाषित करू शकता. हे सुनिश्चित करते की तुमचे मिडलवेअर फक्त आवश्यक असेल तेव्हाच चालते, ज्यामुळे कार्यप्रदर्शन सुधारते आणि ओव्हरहेड कमी होतो.

एज रनटाइम (Edge Runtime)

Next.js मिडलवेअर एज रनटाइमवर चालते, जे एक हलके जावास्क्रिप्ट रनटाइम वातावरण आहे जे तुमच्या वापरकर्त्यांच्या जवळ तैनात केले जाऊ शकते. हे सानिध्य लेटेंसी कमी करते आणि तुमच्या ऍप्लिकेशनचे एकूण कार्यप्रदर्शन सुधारते, विशेषतः जागतिक स्तरावर वितरीत केलेल्या वापरकर्त्यांसाठी. एज रनटाइम Vercel च्या एज नेटवर्क आणि इतर सुसंगत प्लॅटफॉर्मवर उपलब्ध आहे. एज रनटाइममध्ये काही मर्यादा आहेत, विशेषतः Node.js APIs चा वापर.

व्यावहारिक उदाहरणे: मिडलवेअर वैशिष्ट्ये लागू करणे

१. प्रमाणीकरण (Authentication)

प्रमाणीकरण मिडलवेअर अशा रूट्सचे संरक्षण करण्यासाठी वापरले जाऊ शकते ज्यासाठी वापरकर्त्यांना लॉग इन करणे आवश्यक आहे. कुकीज वापरून प्रमाणीकरण कसे लागू करावे याचे एक उदाहरण येथे आहे:


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const token = request.cookies.get('auth_token');

 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/dashboard/:path*'],
}

हे मिडलवेअर auth_token कुकीच्या अस्तित्वाची तपासणी करते. जर कुकी सापडली नाही, तर वापरकर्त्याला /login पेजवर पुनर्निर्देशित केले जाते. config.matcher हे निर्दिष्ट करते की हे मिडलवेअर फक्त /dashboard अंतर्गत रूट्ससाठीच चालले पाहिजे.

जागतिक दृष्टिकोन: विविध प्रमाणीकरण पद्धतींना (उदा. OAuth, JWT) समर्थन देण्यासाठी प्रमाणीकरण लॉजिकमध्ये बदल करा आणि विविध प्रदेशांतील वापरकर्त्यांची पूर्तता करण्यासाठी भिन्न ओळख प्रदात्यांसह (उदा. Google, Facebook, Azure AD) समाकलित करा.

२. अधिकृतता (Authorization)

अधिकृतता मिडलवेअर वापरकर्त्याच्या भूमिका किंवा परवानग्यांच्या आधारावर संसाधनांमध्ये प्रवेश नियंत्रित करण्यासाठी वापरले जाऊ शकते. उदाहरणार्थ, तुमच्याकडे एक ॲडमिन डॅशबोर्ड असू शकतो ज्यामध्ये फक्त विशिष्ट वापरकर्तेच प्रवेश करू शकतात.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 const token = request.cookies.get('auth_token');

 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Example: Fetch user roles from an API (replace with your actual logic)
 const userResponse = await fetch('https://api.example.com/userinfo', {
 headers: {
 Authorization: `Bearer ${token}`,
 },
 });
 const userData = await userResponse.json();

 if (userData.role !== 'admin') {
 return NextResponse.redirect(new URL('/unauthorized', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/admin/:path*'],
}

हे मिडलवेअर वापरकर्त्याची भूमिका मिळवते आणि तपासते की त्यांच्याकडे admin भूमिका आहे की नाही. नसल्यास, त्यांना /unauthorized पेजवर पुनर्निर्देशित केले जाते. हे उदाहरण एका प्लेसहोल्डर API एंडपॉइंटचा वापर करते. `https://api.example.com/userinfo` ला तुमच्या वास्तविक प्रमाणीकरण सर्व्हर एंडपॉइंटने बदला.

जागतिक दृष्टिकोन: वापरकर्त्याचा डेटा हाताळताना डेटा गोपनीयता नियमांचे (उदा. GDPR, CCPA) भान ठेवा. संवेदनशील माहितीचे संरक्षण करण्यासाठी योग्य सुरक्षा उपाययोजना लागू करा आणि स्थानिक कायद्यांचे पालन सुनिश्चित करा.

३. पुनर्निर्देशन (Redirection)

पुनर्निर्देशन मिडलवेअर वापरकर्त्यांना त्यांच्या स्थान, भाषा किंवा इतर निकषांवर आधारित पुनर्निर्देशित करण्यासाठी वापरले जाऊ शकते. उदाहरणार्थ, तुम्ही वापरकर्त्यांना त्यांच्या IP पत्त्यावर आधारित तुमच्या वेबसाइटच्या स्थानिक आवृत्तीवर पुनर्निर्देशित करू शकता.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const country = request.geo?.country || 'US'; // Default to US if geo-location fails

 if (country === 'DE') {
 return NextResponse.redirect(new URL('/de', request.url))
 }

 if (country === 'FR') {
 return NextResponse.redirect(new URL('/fr', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/'],
}

हे मिडलवेअर वापरकर्त्याच्या देशाची त्यांच्या IP पत्त्यावर आधारित तपासणी करते आणि त्यांना वेबसाइटच्या योग्य स्थानिक आवृत्तीवर (जर्मनीसाठी /de, फ्रान्ससाठी /fr) पुनर्निर्देशित करते. जर भौगोलिक-स्थान अयशस्वी झाले, तर ते US आवृत्तीवर डीफॉल्ट होते. लक्षात घ्या की हे geo प्रॉपर्टी उपलब्ध असण्यावर अवलंबून आहे (उदा. Vercel वर तैनात केल्यावर).

जागतिक दृष्टिकोन: तुमची वेबसाइट अनेक भाषा आणि चलनांना समर्थन देते याची खात्री करा. वापरकर्त्यांना त्यांची पसंतीची भाषा किंवा प्रदेश व्यक्तिचलितपणे निवडण्याचा पर्याय द्या. प्रत्येक स्थानासाठी योग्य तारीख आणि वेळ स्वरूप वापरा.

४. A/B चाचणी (A/B Testing)

मिडलवेअरचा वापर A/B चाचणी लागू करण्यासाठी केला जाऊ शकतो, यादृच्छिकपणे वापरकर्त्यांना पेजच्या वेगवेगळ्या प्रकारांमध्ये नियुक्त करून आणि त्यांच्या वर्तनाचा मागोवा घेऊन. येथे एक सोपे उदाहरण आहे:


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

function getRandomVariant() {
 return Math.random() < 0.5 ? 'A' : 'B';
}

export function middleware(request: NextRequest) {
 let variant = request.cookies.get('variant')?.value;

 if (!variant) {
 variant = getRandomVariant();
 const response = NextResponse.next();
 response.cookies.set('variant', variant);
 return response;
 }

 if (variant === 'B') {
 return NextResponse.rewrite(new URL('/variant-b', request.url));
 }

 return NextResponse.next();
}

export const config = {
 matcher: ['/'],
}

हे मिडलवेअर वापरकर्त्यांना 'A' किंवा 'B' या प्रकारांपैकी एकाला नियुक्त करते. जर वापरकर्त्याकडे आधीपासून variant कुकी नसेल, तर एक यादृच्छिकपणे नियुक्त केली जाते आणि सेट केली जाते. 'B' प्रकाराला नियुक्त केलेल्या वापरकर्त्यांना /variant-b पेजवर पुनर्लिखित केले जाते. त्यानंतर तुम्ही प्रत्येक प्रकाराच्या कामगिरीचा मागोवा घ्याल की कोणता अधिक प्रभावी आहे हे ठरवण्यासाठी.

जागतिक दृष्टिकोन: A/B चाचण्या डिझाइन करताना सांस्कृतिक फरकांचा विचार करा. एका प्रदेशात जे चांगले काम करते ते दुसऱ्या प्रदेशातील वापरकर्त्यांना कदाचित आवडणार नाही. तुमची A/B चाचणी प्लॅटफॉर्म वेगवेगळ्या प्रदेशांतील गोपनीयता नियमांनुसार सुसंगत असल्याची खात्री करा.

५. फीचर फ्लॅग्ज (Feature Flags)

फीचर फ्लॅग्ज तुम्हाला नवीन कोड तैनात न करता तुमच्या ऍप्लिकेशनमधील वैशिष्ट्ये सक्षम किंवा अक्षम करण्याची परवानगी देतात. मिडलवेअरचा वापर वापरकर्त्याला त्यांच्या यूजर आयडी, स्थान किंवा इतर निकषांवर आधारित विशिष्ट वैशिष्ट्यात प्रवेश असावा की नाही हे ठरवण्यासाठी केला जाऊ शकतो.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 // Example: Fetch feature flags from an API
 const featureFlagsResponse = await fetch('https://api.example.com/featureflags', {
 headers: {
 'X-User-Id': 'user123',
 },
 });
 const featureFlags = await featureFlagsResponse.json();

 if (featureFlags.new_feature_enabled) {
 // Enable the new feature
 return NextResponse.next();
 } else {
 // Disable the new feature (e.g., redirect to an alternative page)
 return NextResponse.redirect(new URL('/alternative-page', request.url));
 }
}

export const config = {
 matcher: ['/new-feature'],
}

हे मिडलवेअर एका API वरून फीचर फ्लॅग्ज मिळवते आणि new_feature_enabled फ्लॅग सेट आहे की नाही हे तपासते. जर असेल, तर वापरकर्ता /new-feature पेजवर प्रवेश करू शकतो. अन्यथा, त्यांना /alternative-page वर पुनर्निर्देशित केले जाते.

जागतिक दृष्टिकोन: वेगवेगळ्या प्रदेशांतील वापरकर्त्यांसाठी हळूहळू नवीन वैशिष्ट्ये आणण्यासाठी फीचर फ्लॅग्ज वापरा. हे तुम्हाला मोठ्या प्रेक्षकांसाठी वैशिष्ट्य रिलीझ करण्यापूर्वी कार्यप्रदर्शन निरीक्षण करण्याची आणि कोणत्याही समस्यांचे निराकरण करण्याची परवानगी देते. तसेच, तुमची फीचर फ्लॅगिंग प्रणाली जागतिक स्तरावर मोजमाप करते आणि वापरकर्त्याच्या स्थानाकडे दुर्लक्ष करून सातत्यपूर्ण परिणाम देते याची खात्री करा. फीचर रोलआउटसाठी प्रादेशिक नियामक निर्बंधांचा विचार करा.

प्रगत तंत्रे

चेनिंग मिडलवेअर (Chaining Middleware)

तुम्ही एका रिक्वेस्टवर अनेक ऑपरेशन्स करण्यासाठी एकापाठोपाठ अनेक मिडलवेअर फंक्शन्स एकत्र जोडू शकता. हे गुंतागुंतीचे लॉजिक लहान, अधिक व्यवस्थापनीय मॉड्यूल्समध्ये विभागण्यासाठी उपयुक्त ठरू शकते.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const response = NextResponse.next();

 // First middleware function
 const token = request.cookies.get('auth_token');
 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Second middleware function
 response.headers.set('x-middleware-custom', 'value');

 return response;
}

export const config = {
 matcher: ['/dashboard/:path*'],
}

हे उदाहरण एकाच वेळी दोन मिडलवेअर्स दाखवते. पहिले प्रमाणीकरण करते आणि दुसरे एक सानुकूल हेडर सेट करते.

एनव्हायर्नमेंट व्हेरिएबल्स वापरणे

API की आणि डेटाबेस क्रेडेन्शियल्स सारखी संवेदनशील माहिती तुमच्या मिडलवेअर फंक्शन्समध्ये हार्डकोड करण्याऐवजी एनव्हायर्नमेंट व्हेरिएबल्समध्ये संग्रहित करा. यामुळे सुरक्षा सुधारते आणि तुमच्या ऍप्लिकेशनच्या कॉन्फिगरेशनचे व्यवस्थापन सोपे होते.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const API_KEY = process.env.API_KEY;

export async function middleware(request: NextRequest) {
 const response = await fetch('https://api.example.com/data', {
 headers: {
 'X-API-Key': API_KEY,
 },
 });

 // ...
}

export const config = {
 matcher: ['/data'],
}

या उदाहरणात, API_KEY एनव्हायर्नमेंट व्हेरिएबलमधून मिळवली जाते.

त्रुटी हाताळणी (Error Handling)

तुमच्या ऍप्लिकेशनला अनपेक्षित त्रुटींमुळे क्रॅश होण्यापासून रोखण्यासाठी तुमच्या मिडलवेअर फंक्शन्समध्ये मजबूत त्रुटी हाताळणी लागू करा. अपवाद पकडण्यासाठी आणि त्रुटी योग्यरित्या लॉग करण्यासाठी try...catch ब्लॉक्स वापरा.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 try {
 const response = await fetch('https://api.example.com/data');
 // ...
 } catch (error) {
 console.error('Error fetching data:', error);
 return NextResponse.error(); // Or redirect to an error page
 }
}

export const config = {
 matcher: ['/data'],
}

सर्वोत्तम पद्धती

सामान्य समस्यांचे निवारण

निष्कर्ष

Next.js मिडलवेअर हे डायनॅमिक आणि वैयक्तिकृत वेब ऍप्लिकेशन्स तयार करण्यासाठी एक शक्तिशाली साधन आहे. रिक्वेस्ट इंटरसेप्शनमध्ये प्रभुत्व मिळवून, तुम्ही प्रमाणीकरण आणि अधिकृततेपासून ते पुनर्निर्देशन आणि A/B चाचणीपर्यंत अनेक वैशिष्ट्ये लागू करू शकता. या मार्गदर्शिकेत नमूद केलेल्या सर्वोत्तम पद्धतींचे पालन करून, तुम्ही तुमच्या जागतिक वापरकर्ता बेसच्या गरजा पूर्ण करणारे उच्च-कार्यक्षमता, सुरक्षित आणि स्केलेबल ऍप्लिकेशन्स तयार करण्यासाठी Next.js मिडलवेअरचा लाभ घेऊ शकता. तुमच्या Next.js प्रकल्पांमध्ये नवीन शक्यता अनलॉक करण्यासाठी आणि अपवादात्मक वापरकर्ता अनुभव देण्यासाठी मिडलवेअरच्या सामर्थ्याचा स्वीकार करा.