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

السؤال

Recommended Posts

  • 0
نشر

بسبب أنك أرسلت طلب للمسار GET /api/auth/todos/id مع قيمة نصية للـ id وليس رقم من نوع ObjectId أي 24 حرف سداسي. فمكتبة Mongoose تعمل على تحويل الـ id إلى ObjectId لذا يجب تمرير قيمة صحيحة.

لذا مرر معرف todo الصحيح في الـ URL بدل "id"، أي كالتالي /api/auth/todos/66f6a6b13f0d8b1a2c1c1234

ثم إضافة تحقق من صلاحية المعرف قبل الاستعلام لتجنب خطأ 500 وإرجاع 400 في حال المعرف غير الصحيح.

أيضًا عند إنشاء مشروع Next.js (App Router)، فدوال المسارات الديناميكية تستقبل params داخل كائن ثانٍ بشكل هيكلي، والتوقيع الصحيح هو:

 (request, { params })

وليس (request, params)

ليصبح ملف route.ts:

import { connectDB } from "@/app/libs/connectDB";
import { NextRequest, NextResponse } from "next/server";
import jwt from 'jsonwebtoken';
import User from "@/app/models/User";
import Todos from "@/app/models/Todos";
import mongoose from "mongoose";

type Params  = {
    id: string;
}

export async function GET(request:NextRequest, {params} : {params: Params }){
    try{
    await connectDB();
    const authHeader = request.headers.get("authorization");
    if(!authHeader || !authHeader.startsWith("Bearer ")){
        return NextResponse.json({error: "Unauthorized"}, {status:401})
    }
    const token = authHeader.split(" ")[1];
    const decoded = jwt.verify(token , process.env.JWT_SECRET);
    const userId =  (decoded as {userId?: string}).userId;
    if(!userId){
        return NextResponse.json({error: "Unauthorized"}, {status:401})
    }
    const user = await User.findById(userId);
    if(!user){
        return NextResponse.json({error: "User not found!"}, {status: 404});
    }

    if (!mongoose.Types.ObjectId.isValid(params.id)) {
        return NextResponse.json({ error: "Invalid id" }, { status: 400 });
    }

    const task = await Todos.findOne({_id: params.id , userId});
    if(!task){
        return NextResponse.json({error: "Task not found"}, {status: 404});
    }
    return NextResponse.json({task})
    }catch(e:any){
        return NextResponse.json({error: e.message}, {status:500})
    }
}

export async function PATCH(request:NextRequest, { params }: { params: Params }){
    try{
    await connectDB();
    const {title , content} = await request.json();
    const authHeader = request.headers.get("authorization");
    if(!authHeader || !authHeader.startsWith("Bearer ")){
         return NextResponse.json({error: "Unauthorized"}, {status:401})
    }
     const token = authHeader.split(" ")[1];
        const decoded =  jwt.verify(token , process.env.JWT_SECRET)
        const userId =  (decoded as {userId?: string}).userId;
        if(!userId){
            return NextResponse.json({error: "Unauthorized"}, {status:401})
        }
        const user = await User.findById(userId).select("-password");
        if(!user){
            return NextResponse.json({error: "User not found!"}, {status: 404});
        }

        if (!mongoose.Types.ObjectId.isValid(params.id)) {
            return NextResponse.json({ error: "Invalid id" }, { status: 400 });
        }

        const taskUpdate = await Todos.findOneAndUpdate(
            {_id: params.id , userId},
            { title , content },
            {new: true}
        );
        if(!taskUpdate){
            return NextResponse.json({error: "Task not found"}, {status: 404});
        }
        return NextResponse.json(taskUpdate);
    }catch(e:any){
          return NextResponse.json({error: e.message}, {status:500})
    }
}

export async function DELETE(request:NextRequest, { params }: { params: Params }){
    try{
        await connectDB();
    const authHeader = request.headers.get("authorization");
    if(!authHeader || !authHeader.startsWith("Bearer ")){
        return NextResponse.json({error: "Unauthorized"}, {status:401})
    }
    const token = authHeader.split(" ")[1];
    const decoded = jwt.verify(token , process.env.JWT_SECRET);
    const userId =  (decoded as {userId?: string}).userId;
    if(!userId){
        return NextResponse.json({error: "Unauthorized"}, {status:401})
    }
    const user = await User.findById(userId);
    if(!user){
        return NextResponse.json({error: "User not found!"}, {status: 404});
    }

    if (!mongoose.Types.ObjectId.isValid(params.id)) {
        return NextResponse.json({ error: "Invalid id" }, { status: 400 });
    }

    const taskDelete = await Todos.findOneAndDelete({_id: params.id, userId});
    if(!taskDelete){
         return NextResponse.json({error: "Task not found"}, {status: 404});
    }
    return NextResponse.json(taskDelete);
    }catch(e:any){
          return NextResponse.json({error: e.message}, {status:500})
    }
}

 

  • 0
نشر

اوك اخي مصطفى مشكور بس وقت حطيت شرط يلي يتحقق من وجود id وقت استخدمت دالة PATCH و DELETE في مجلد [id] ظهرت استجابة invalid id  بس انا عرفت id ب params ومع ذالك يوجد خطأ

 if (!mongoose.Types.ObjectId.isValid(params.id)) {
            return NextResponse.json({ error: "Invalid id" }, { status: 400 });
        }

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...