typescript - Modul '"@clerk/nextjs"' nema izvezenog člana 'auth'
Implementiram Clerk Js autentifikaciju u svojoj Next aplikaciji.
import Link from 'next/link';
import React from 'react';
import { UserButton, auth, useAuth } from '@clerk/nextjs';
// import { auth } from '@clerk/nextjs/dist/types/server';
const Navbar = async () => {
const {userId} = await auth();
const isAuth = !!userId
return (
Međutim, dobivam pogrešku na terminalu i pregledniku koja kaže: Module '"@clerk/nextjs"' has no exported member 'auth'.ts(2305).
Izbrisao sam auth iz importa i uvezao ga iz/import { auth } from '@clerk/nextjs/dist/types/server'; umjesto toga i ne vraća nikakvu pogrešku.
Prilikom spremanja, dobivam još jednu TypeScript pogrešku: Modul nije pronađen: Putanja paketa ./dist/types/server nije izvezena iz paketa.
Što bi moglo uzrokovati ovo i kako to mogu riješiti. Instalirao sam "@clerk/nextjs": "^5.2.2".
Evo cijelog koda:
import Link from 'next/link';
import React from 'react';
import { UserButton, useAuth } from '@clerk/nextjs';
import { auth } from '@clerk/nextjs/dist/types/server';
const Navbar = async () => {
const {userId} = await auth();
const isAuth = !!userId
return (
<div>
<ul className=' flex justify-between m-10 items-center'>
<div>
<Link href="/">
<li>Home</li>
</Link>
</div>
<div className='flex gap-10'>
{!isAuth ? (
<>
<Link href="/sign-in">
<li>Login</li>
</Link>
<Link href="/sign-up">
<li>Signup</li>
</Link>
</>
): (
<>
<Link href="/sign-up">
<li>Profile</li>
</Link>
<li><UserButton/></li>
</>
)}
</div>
</ul>
</div>
)
}
export default Navbar
Evo mog middleware.ts koda iz Clerk dokumentacije:
import { clerkMiddleware } from "@clerk/nextjs/server";
export default clerkMiddleware();
export const config = {
matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)", "/(.*)"],
};
Uvezao sam import { UserButton, auth, useAuth } iz '@clerk/nextjs'; i očekivao sam da ću ga uspješno koristiti za autentifikaciju korisnika:
const Navbar = async () => {
const {userId} = await auth();
const isAuth = !!userId
Odgovor #1
import { auth } from "@clerk/nextjs/server";
Uvezi ga iz @clerk/nextjs/server, promijenjeno je s @clerk/nextjs kako bi se smanjila veličina paketa
Odgovor #2
Imao sam sličan problem ranije. Vjerojatno ćeš htjeti koristiti:
- Komponenta ClerkProvider
- Svako dijete ove komponente višeg reda imat će pristup posebni hook-ovima za clerk poput
useAuthkao i komponentama poput<Signup>itd. kako bi vam olakšali život Ove pogodnosti na strani klijenta neće raditi osim ako se ne koriste:
- u potomcima komponenti
<ClerkProvider>
- u potomcima komponenti
- na vrh datoteke stavite 'use client' za sve komponente koje koriste (clerk) hookove, jer su oni isključivo funkcije na strani klijenta.
- Kao što je osoba gore spomenula, ispravan uvoz je
import { auth } from "@clerk/nextjs/server"
Implementacija na strani poslužitelja/pozadinske strane je nešto drugačija.
