---
# System prepended metadata

title: Nuxt3 API Proxy Setup
tags: [Nuxt3, proxyRequest, Nitro Server, Work]

---

# Nuxt3 API Proxy Setup

![nuxt logo](https://res.cloudinary.com/dfzftvkli/image/upload/8dc47589-0090-44c8-a4c5-79e6696ec7c6 =200x)

To start a new application, in order **NOT** to encounter [CORS](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CORS) issue in dev mode, it's always crucial to handle api proxy setup if you need another third party backend service as source.

Here is a quick guideline for beginners to setup.

## Flow

There are two possible flows.

### I. Nuxt page

User enters a page and fetch api related with third party server in either CSR or SSR.

`Nuxt Page` -- Fetch api through [useFetch](https://nuxt.com/docs/api/composables/use-fetch) or [$fetch](https://nuxt.com/docs/api/utils/dollarfetch) directly -- `Nitro Server API Proxy Route` --> `Backend service`

### II. Server route

User enters a server only route and the route requires some API response from third party server.

`Server Route` -- Fetch api through [$fetch](https://nuxt.com/docs/api/utils/dollarfetch) directly --> `Nitro Server API Proxy Route`  --> `Backend service`

## Background

Here are simples example for developers to understand the condition of backend service and api entrypoint.

### API Base Url

The domain of backend service, it'll change by environment.

`.env`
```
NUXT_PUBLIC_API_BASE_URL=http://localhost:3005
```
`.env.production`
```
NUXT_PUBLIC_API_BASE_URL=https://ec-bot-web.line-apps-beta.com
```

This variable will be referred as `useRuntimeConfig().public.apiBaseUrl` in whole nuxt project.

### API Entrypoint

The api endpoint to serve response. Imagine that calling http://localhost:3005/hello or https://ec-bot-web.line-apps-beta.com/hello
 will response a simple JSON.

`{api-base-url}/hello`

```json
{
  "hello": "world"
}
```

## Get Started

To fetch api, no matter it comes from nuxt page or server route, the path will be like `/api/**` so it can be defined as api proxy route pattern later.

### Nuxt Page

Here are two simple examples to fetch api from nuxt pages.

I. Fetch api through [useFetch](https://nuxt.com/docs/api/composables/use-fetch) composable.

```typescript
// pages/hello-world.vue
const { data } = await useFetch('/api/hello')
```

II. Fetch api through [useAsyncData](https://nuxt.com/docs/api/composables/use-async-data) ($fetch) composable.

```typescript
// pages/hello-world.vue
const { data } = await useAsyncData('hello', () => $fetch('/api/hello'))
```

### Server Route

Here is an example to fetch backend service api in server route. User will get `hello world` string by typing URL `{your-nitro-host}/hello-world`.

```typescript
// server/routes/hello-world
export default defineEventHandler(async (event) => {
  const { hello } = await $fetch('/api/hello')
  return `hello ${hello}`
})
```

### Nitro Server

Add a proxy api endpoint in nitro server to handle CORS issue. It will replace `/api/**` with `/**` and add proxyUrl at the beginning. For example: `/api/hello` will b[](https://)e transformed to http://localhost:3005/hello and proxy the request.

```typescript
// server/api/[...].ts
import { joinURL } from 'ufo'

export default defineEventHandler(async (event) => {
  const proxyUrl = useRuntimeConfig().public.apiBaseUrl
  const path = event.path.replace(/^\/api\//, '')
  const target = joinURL(proxyUrl, path)

  return proxyRequest(event, target)
})
```

That's it! Now you can feel free to request third party backend service api in your application.

## Summary

It's recommend to use [proxyRequest](https://h3.unjs.io/utils/advanced#proxyrequestevent-target-opts) instead of [devServer](https://nuxt.com/docs/api/nuxt-config#devserver) if you need to proxy request in both client and server side because [devServer](https://nuxt.com/docs/api/nuxt-config#devserver) will **NOT** proxy request in nitro server itself. Which means request from nitro server to nitro server won't trigger a proxy that case. Besides, the api flow will be precise and easy to trace from either CSR or SSR.

###### tags: `Work` `Nuxt3` `Nitro Server` `proxyRequest`