Both the FastAPI backend and the Next.js frontend are running on localost
. On the same computer, the frontend makes API calls using fetch
without any issues. However, on a different computer on the same network, e.g., on 192.168.x.x
, the frontend runs, but its API calls are no longer working.
I have tried using a proxy as next.js but that still does not work.
Frontend:
export default function People({setPerson}:PeopleProps) {
const fetcher = async (url:string) => await axios.get(url).then((res) => res.data);
const { data, error, isLoading } = useSWR(`${process.env.NEXT_PUBLIC_API}/people`, fetcher);
if (error) return <div>"Failed to load..."</div>;
return (
<>
{isLoading? "Loading..." :data.map((person: Person) =>
<div key={person.id}> {person.name} </div>)}
</>
)
}
The Next.js app loads the env.local
file at startup, which contains:
NEXT_PUBLIC_API=http://locahost:20002
Backend:
rom typing import List
from fastapi import APIRouter, Depends
from ..utils.db import get_session as db
from sqlmodel import Session, select
from ..schemas.person import Person, PersonRead
router = APIRouter()
@router.get("/people", response_model = List[PersonRead])
async def get_people(sess: Session = Depends(db)):
res = sess.exec(select(Person)).all()
return res
The frontend runs with: npm run dev
, and outputs
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
The backend runs with: uvicorn hogar_api.main:app --port=20002 --host=0.0.0.0 --reload
, and outputs:
INFO: Uvicorn running on http://0.0.0.0:20002 (Press CTRL+C to quit)
When I open the browser on http://localhost:3000
on the same machine the list of Person
is displayed on the screen.
When I open the browser on http://192.168.x.x:3000
on another machine on the same network, I get the "Failed to Load..." message.
When I open the FastAPI swagger docs on either machine, the documentation is displayed correctly and all the endpoints work as expected.
CORS look like this:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost:3000",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)