javascript - Fel vid hantering av felmeddelanden för inloggning: http://localhost:3000/auth/login net::ERR_ABORTED 405 (Metod ej tillåten)
Jag har denna /app/auth/login/route.ts
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs'
import { cookies } from 'next/headers'
import { NextResponse } from 'next/server'
export async function POST(request: Request) {
const requestUrl = new URL(request.url)
const formData = await request.formData()
const email = String(formData.get('email'))
const password = String(formData.get('password'))
const cookieStore = cookies()
const supabase = createRouteHandlerClient({ cookies: () => cookieStore })
await supabase.auth.signInWithPassword({
email,
password,
})
return NextResponse.redirect(requestUrl.origin, {
status: 301,
})
}
Och sidan som finns på /app/login/page.tsx
import Link from "next/link";
export default function LoginPage() {
return (
<>
<form action="/auth/login" method="post">
<label htmlFor="email">Email</label>
<input name="email" />
<label htmlFor="password">Password</label>
<input type="password" name="password" />
<button>Sign In</button>
</form>
<Link href="/reset-password">Reset Password</Link>
</>
)
}
Det var de koder som jag fick från dokumentationen. Jag kan dock inte implementera där det visar att de har loggat in framgångsrikt och felhanteringen.
Jag följde svaren nedan, men jag får detta fel:
POST http://localhost:3000/auth/login net::ERR_ABORTED 405 (Metod Inte Tillåten)
route.ts
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
import { NextApiRequest, NextApiResponse } from 'next'; // Correct import for NextApiRequest and NextApiResponse
import { cookies } from 'next/headers';
import { NextResponse } from 'next/server'; // Correct import for NextResponse
export async function handler(
req: NextApiRequest, // Correct the parameter list
res: NextApiResponse // Correct the parameter list
) {
const jsonBody = await req.body.json(); // Change 'request' to 'req'
const email = jsonBody.email;
const password = jsonBody.password;
const cookieStore = cookies();
const supabase = createRouteHandlerClient({ cookies: () => cookieStore });
try {
const { error } = await supabase.auth.signInWithPassword({
email,
password,
});
if (error) {
return res.status(401).json({ message: 'Login failed. Please check your credentials.' });
}
return res.status(200).json({ message: 'Login successful' });
} catch (error) {
console.error('An error occurred:', error);
return res.status(500).json({ message: 'An unexpected error occurred' });
}
}
api/login/page.tsx
'use client'
import { useRouter } from 'next/navigation';
import { useState } from 'react';
export default function LoginPage() {
const router = useRouter();
const [error, setError] = useState<string>('');
const [email, setEmail] = useState<string>('');
const [password, setPassword] = useState<string>('');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError('');
try {
const response = await fetch('/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
if (response.status === 200) {
router.push('/');
} else {
if (response.headers.get('content-type')?.includes('application/json')) {
// Check if the response contains JSON data.
const result = await response.json();
setError(result.message);
} else {
// Handle non-JSON responses (e.g., empty responses).
setError('An unexpected error occurred.');
}
}
} catch (error) {
console.log(error, "error on the login page.tsx")
console.error('An error occurred:', error);
setError('An unexpected error occurred.');
}
};
return (
<>
<form onSubmit={handleSubmit}>
<label htmlFor="email">Email</label>
<input
type="email"
name="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Sign In</button>
</form>
{error && <p>{error}</p>}
</>
);
}
Svar #1
Jag tycker att du borde skicka en POST JSON-förfrågan och hantera den med JavaScript:
import { useRouter } from 'next/router';
import { useState } from 'react';
export default function LoginPage() {
const router = useRouter();
const [error, setError] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const handleSubmit = async (e) => {
e.preventDefault();
setError('');
try {
const response = await fetch('/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
if (response.status === 200) {
router.push('/some-page-after-login')
} else {
const result = await response.json();
setError(result.message);
}
} catch (error) {
console.error('An error occurred:', error);
setError('An unexpected error occurred.');
}
};
return (
<>
<form onSubmit={handleSubmit}>
<label htmlFor="email">Email</label>
<input
type="email"
name="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Sign In</button>
</form>
{error && <p>{error}</p>}
</>
);
}
Och i API:et:
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
import { cookies } from 'next/headers';
import { NextResponse } from 'next/server';
export async function handler(
req: NextApiRequest,
res: NextApiResponse<ResponseData>
) {
const jsonBody = await request.json();
const email = jsonBody.email;
const password = jsonBody.password;
const cookieStore = cookies();
const supabase = createRouteHandlerClient({ cookies: () => cookieStore });
try {
const { user, error } = await supabase.auth.signInWithPassword({
email,
password,
});
if (error) {
return res.status(401).json({ message: 'Login failed. Please check your credentials.' })
}
return res.status(200).json({ message: 'Login successful' })
} catch (error) {
console.error('An error occurred:', error);
return res.status(500).json({ message: 'An unexpected error occurred' })
}
}
