اذهب إلى المحتوى
  • 0

أواجه مشكل في إستخدام الدوال الوسيطة في next-intel

محمود_سعداوي

السؤال

السلام عليكم.

نبذة عن المشروع: عبارة عن قائمة مهام باستخدام nextjs typescript postegres prisma.

المستخدم المسجل هو فقط من يمكنه إضافة مهمة

بنية المشروع:

src
|_ app
  |_[locale]
  |_api
	|_taskaties
middleware.ts
i18n.ts

taskaties/route.ts

export async function GET (request: NextRequest) {
    try {
        const user = verifyToken(request)
        if (!user) {
            return NextResponse.json({message: "Access Denied!"}, {status: 401})
        }

        const tasks = await prisma.task.findMany()

        return NextResponse.json(tasks, {status: 201})
    } catch (error) {
        console.error("Error: ", error)
        return NextResponse.json({
            message: "Internal Server Error"
        }, { status: 500 })
    }
}

middleware.ts

1.

export const config = {
    matcher: ['/((?!api|_next|.*\\..*).*)', '/api/taskaties/*],
}

 export function middleware (request: NextRequest) {
     const token = request.cookies.get('jwtToken')?.value
     if (!token) {
         if (request.nextUrl.pathname.startsWith("/api/taskaties")) {
             return NextResponse.json(
                 { message: 'No Token Provided, Access Denied!' },
                 { status: 401 }
             )
         }
     }

     return NextResponse.next()
 }

 export default createMiddleware({
     locales: ["en", "fr", "ar"],
     defaultLocale: "ar",
 });

في هذه الحالة يتم جلب المهام من قاعدة البيانات غير أنه لايتم التعرف على الواجهات ويتم إرجاع صفحة notFound

2. قمت بتعديل الكود ليصير كالتالي

export const config = {
    matcher: ['/((?!api|_next|.*\\..*).*)'],
}

export function middleware(request: NextRequest) {
    const token = request.cookies.get('jwtToken')?.value;
  
    if (!token && request.nextUrl.pathname.startsWith("/api/taskaties")) {
      return NextResponse.json(
        { message: 'No Token Provided, Access Denied!' },
        { status: 401 }
      );
    }
  
    return createMiddleware({
      locales: ["en", "fr", "ar"],
      defaultLocale: "en",
    })(request);
  }

غير أ،ه في هذه الحالة عندما لا يكون لدي token  يتم إرجاع `{message: "Access Denied!"}, {status: 401}` عوضا عن `{ message: 'No Token Provided, Access Denied!' }` وبالتالي لم يتم تفعيل الدوال الوسيطة التي تهدف للتحقق من المستخدم.

شكرا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الحالة الأولى الطبقة الوسيطة وملف taskaties/route.ts ليس به مشكلة يبدو أن المسارات الأخرى الخاصة بواجهات المستخدم لا تعمل بشكل صحيح وتعيد صفحة notFound.

الحالة الثانية المشكلة تكمن في هذا الإعداد config

export const config = {
    matcher: ['/((?!api|_next|.*\\..*).*)'],
}

يستثني جميع المسارات التي تبدأ بـ /api أو / _next ولا يتم تفعيل الطبقة الوسيطة عليها أبدا حيث أن الملف taskaties بداخل مجلد api ونحن نريد الطبقة الوسيطة مع التأكد من أن المسار يبدأ api/taskaties/ 

if (!token && request.nextUrl.pathname.startsWith("/api/taskaties")) {
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/*باقي الكود*/
}
  
  

لذلك نقوم بتغيير الإعداد config وتعديله لكي لا يتم استثناء تطبيق الطبقة الوسيطة على أي مسار يبدأ بـ api/ كالأتي

export const config = {
  matcher: ['/((?!_next|.*\\..*).*)'], // إزالة استثناء `/api`
};

مع تعديل الطبقة الوسيطة لتصبح كالأتي

export const config = {
  matcher: ['/((?!_next|.*\\..*).*)'], // إزالة استثناء `/api`
};

export function middleware(request: NextRequest) {
    const token = request.cookies.get('jwtToken')?.value;
    if (!token && request.nextUrl.pathname.startsWith("/api/taskaties")) {
        return NextResponse.json(
            { message: 'No Token Provided, Access Denied!' },
            { status: 401 }
        );
    }

    // السماح لبقية الطلبات بالمرور
    return NextResponse.next();
}

export default createMiddleware({
    locales: ["en", "fr", "ar"],
    defaultLocale: "ar",
});
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...