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

السؤال

نشر

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

نبذة عن المشروع: عبارة عن قائمة مهام باستخدام 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",
});
  • 0
نشر
بتاريخ 12 ساعة قال Mustafa Mahmoud7:

الحالة الأولى الطبقة الوسيطة وملف 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",
});

شكرا

مفس الشيء.

هذه رسالة الخطأ

Unable to find `next-intl` locale because the middleware didn't run on this request. See https://next-intl-docs.vercel.app/docs/routing/middleware#unable-to-find-locale. The `notFound()` function will be called as a result.

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...