My nextjs app was statically generated, and previously I was able to run next build && next export
and deploy using netlify deploy
Now I have added some API routes and when automatic builds are enabled, the essential next plugin is able to create functions for me and the API is correctly mapped to /api/ routes. Is it possible to do this step manually with the netlify CLI?
I tried doing netlify deploy --functions="pages/api"
and the functions are deployed, but they are mapped to netlify routes ("/.netlify/functions") instead of next routes ("/api/") like they would be with the plugin run during automatic builds.
Also, I haven’t checked this but I assume the function parameters would be different as well (netlify functions being event, context
and nextJS functions having express styled res, res
)
Hey there, @rosghub
Welcome to the Netlify Forums! Glad you found us. Before we dive in, could you share your Netlify site, your function name, and your repo (if public?)
This will help us discuss this in further detail. Thanks!
Hi @rosghub
If I have understood correctly, you are wanting to use Netlify functions but instead of using /.netlify/functions/<function-name>
you want to use /api/<function-name>
.
My method when deploying from the CLI it to set up a netlify.toml
[build]
command = "<my-command>" # e.g. next build && next export
functions = "path/to/functions" # default is `netlify/functions`
publish = "<build-output-directory>" # e.g. `out`
But you will also want to set up a redirect too if you wish to use /api/<function-name>
in your netlify.toml
(see docs above)
[[redirects]]
from = "/api/*"
to = "/.netlify/function/:splat"
so you can call /api/<my-function>
not /.netlify/functions/<my-function>
@coelmay
Perfect, that should solve the issue of routing
Now my only issue is that netlify function parameters (which uses AWS styled (event, context)
params) are different than nextJS API route params (which use express styled (req, res)
params).
And netlify functions depend on a return value where as nextJS API routes depend on a call to res.status()
Not sure how the nextJS plugin does it all.
I haven’t gone to great depths with Next.js, but I am thinking (possibly I am wrong) when they say
Any file inside the folder pages/api
is mapped to /api/*
and will be treated as an API endpoint instead of a page
.
I am thinking this mapping is done internally (within the router).
Looking at the example on the docs you linked to, they use swr
to handle calls to /api
routes. This is Vercel documentation, so if/how it works on Netlify I cannot say.