created the default project using npx create-next-app@latest
src/pages/index.tsx
import useSWR from 'swr'
const fetcher = (url: string) => fetch(url).then((r) => r.json());
export default function Home() {
const { data, error, isLoading } = useSWR('/api/hello', fetcher,{
onSuccess: async (data) => {
console.log('we got a success');
},
onError: (err) => {
console.log('we got an error');
}
});
console.log(`data: ${JSON.stringify(data)}`);
console.log(`error: ${JSON.stringify(error)}`);
console.log(`isLoading: ${JSON.stringify(isLoading)}`);
return (
<></>
)
}
src/pages/api/hello.tsx
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
name: string
}
export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(400).json({ name: 'John Doe' })
//res.status(400).end();
}
With the code above I'm getting the log from the onSuccess
method, console prints that we have data (name: 'John Doe') and error is undefined
.
If comment the line with json({...})
and uncomment the one with .end()
I get the log from onError
but I can't pass any additional information.
Seems like any send method of NextApiResponse
like json()
or send()
result in invocation of the onSuccess
.
I want to be able to send JSON object in case of an error and onSuccess
or onError
to be called accordingly to the status passed to res.status()
.
What am I missing?