Uma solução semelhante a isso, é utilizar o next.config.js, que ao incluir a função rewrites(), você vai ter a reescrita da colicitação.
segue função:
async rewrites() {
return [
{
source: '/api/:path*',
destination: `${process.env.BACKEND_URL}/:path*`
}
]
}
em source temos a origem que será substituida, no caso estamos indicando que qualquer solicitação para /api, será reescrita, exemplo: http://localhost:3000/api/login
tudo que está após /api/, será vinculado a variavel :path, que será usado no destino
em destination, temos o destino, que pode ser algo fixo, ou o que recomendo que seja variavel de ambiente, conforme o exemplo. No caso do exemplo do login, internamente o processamento seria visivel ao usuario para localhost:3000/api/login, porem internamente teria sido reescrito para o backend localhost:8080/login
Observe que tudo que colocar após api/ será considerado no destino, exemplo:
localhost:3000/api/cadastro/cliente/novo será reescrito internamente para localhost:8080/cadastro/cliente/novo
os metodos não são reescrito, então se fizer POST na rota, a reescrita também usará POST