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

السؤال

نشر

انا حليت مشكلة url لكن توجد مشكلة لم افهمها والتي هي ان دالة PATCH ترجع null بدل من تعديل اما دالة DELETE ترجع استجابة خاظئة ولم افهم ما مشكلة

import { connectDB } from "@/app/libs/connectDB";
import { NextRequest, NextResponse } from "next/server";
import Todos from "@/app/models/Todos";
import { authenticate } from "@/app/libs/authenticate";
import mongoose from "mongoose";

type Params  = {
    id: mongoose.Types.ObjectId;
}

export async function GET(request:NextRequest, {params} : {params: Params }){
    try{
    await connectDB();
    const userId = await authenticate(request);
    const task = await Todos.findOne({_id: params.id , userId});
    return NextResponse.json({task})
    }catch(e:any){
        return NextResponse.json({error: e.message}, {status:500})
    }
}

export async function PATCH(request:NextRequest , params:Params){
    try{
    await connectDB();
    const {title , content} = await request.json();
    const userId = await authenticate(request);
        const taskUpdate = await Todos.findOneAndUpdate({_id: params.id , userId}, { title , content }, {new: true});
        return NextResponse.json(taskUpdate);
    }catch(e:any){
          return NextResponse.json({error: e.message}, {status:500})
    }
    
}

export async function DELETE(request:NextRequest , params:Params){
    try{
        await connectDB();
        const userId = await authenticate(request);
    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})
    }
}

 

2.png

Recommended Posts

  • 0
نشر

توقيع الدوال في [id]/route.ts غير صحيح قمت بتعريفها كـ PATCH(request, params) وDELETE(request, params) بدلًا من PATCH(request, { params }) وDELETE(request, { params }).

بالتالي params.id يصبح undefined،  عند إنشاء مشروع Next.js (App Router)، فدوال المسارات الديناميكية تستقبل params داخل كائن ثانٍ بشكل هيكلي، والتوقيع الصحيح هو (request, { params }) وليس (request, params)

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})
    }
}

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...