Thursday, 21 September 2023

Next.js - error TypeError: Cannot redefine property: $$id

I am working on a Next.js tutorial following along with a youtube video. This is a clone of Facebook Threads that I am working towards to learn Next.js. For the part of creating a thread a.k.a. (simple post). I get this 500 error from the application:

- error node_modules/next/dist/build/webpack/loaders/next-flight-loader/action-proxy.js (37:11) @ defineProperties
- error TypeError: Cannot redefine property: $$id
    at Function.defineProperties (<anonymous>)
    at eval (./lib/actions/thread.actions.ts:43:81)
    at (actionBrowser)/./lib/actions/thread.actions.ts (/Users/danielrubio/Desktop/threads/.next/server/app/(root)/create-thread/page.js:3366:1)
    at Function.__webpack_require__ (/Users/danielrubio/Desktop/threads/.next/server/webpack-runtime.js:33:42)
null

I can see from the output that the culprit is line 43 of thread.actions.ts. However, I don't have a line 43 in that file. Below is the file in full:

'use server'

import User from "../models/user.model";
import Thread from "../models/thread.model";
import { connectToDB } from "../mongoose";
import { revalidatePath } from "next/cache";


interface Params {
  text: string,
  author: string,
  communityId: string | null,
  path: string,
}

export async function createThread({text, author, communityId, path} :Params) {
  try {
    connectToDB();

    const createdThread = await Thread.create({
      text,
      author,
      community: null,
    })
  
    await User.findByIdAndUpdate(author, {
      $push: { threads: createdThread._id }
    })
  
    revalidatePath(path);
  } catch(error: any) {
    throw new Error(`Failed to create thread: ${error.message}`);
  }
 
}

export default createThread;

The file only contains 37 lines so I don't know what could be causing this error. From previous work with React, I am thinking this is some kind of TypeScript error but I'm not sure.

Below is the model for a thread:

import mongoose from 'mongoose';

const threadSchema = new mongoose.Schema({
  text: { type: String, required: true },
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true
  },
  community: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Community'
  },
  createdAt: {
    type: Date,
    default: Date.now
  },
  parentId: {
    type: String
  },
  children: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Thread'
    }
  ]
  
})

const Thread = mongoose.models.Thread || mongoose.model('Thread', threadSchema);

export default Thread;

And here is the Form that I am rendering to create a thread:

'use client'

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod'
import * as z from 'zod';
import { usePathname, useRouter } from 'next/navigation';
import { Button } from '../ui/button';
import {
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/components/ui/form"
import { Textarea } from "@/components/ui/textarea"

import { ThreadValidation } from '@/lib/validations/thread';
import createThread from '@/lib/actions/thread.actions';

interface Props {
  userId: string;
}

function PostThread({ userId }: Props ) {
  const router = useRouter();
  const pathname = usePathname();

  const form = useForm({
    resolver: zodResolver(ThreadValidation), 
    defaultValues: {
      threads: '',
      accountId: userId,
    }
  })
  
  const onSubmit = async (values: z.infer<typeof ThreadValidation>) => {
    await createThread({
      text: values.thread,
      author: userId,
      communityId: null,
      path: pathname

    })

    router.push('/')
  }

  return(
    <Form {...form}>
      <form
        className='flex flex-col justify-start gap-10'
        onSubmit={form.handleSubmit(onSubmit)}
      >
  
        <FormField
          control={form.control}
          name='thread'
          render={({ field }) => (
            <FormItem className='flex w-full flex-col gap-3'>
              <FormLabel className='text-base-semibold text-light-2'>
                Content
              </FormLabel>
              <FormControl className='no-focus border border-dark-4 bg-dark-3 text-light-1'>
                <Textarea
                  rows={15}
                  {...field}
                />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
    
        <Button type='submit' className='bg-primary-500'>
          Post Thread
        </Button>
      </form>
    </Form>
  )
  
}

export default PostThread;

I am completely new to Next.js so Im having a little bit of a difficult time understanding what this error could mean. If there is anyone that could help me understand how to troubleshoot this, I would appreciate it.



from Next.js - error TypeError: Cannot redefine property: $$id

No comments:

Post a Comment