Fetch

Nitro provides a built-in fetch API that can be used to get data from server endpoints or from other sources. It's built on top of the ofetch.

Usage

In your handler, you just have to call the $fetch function to make a request. The response will be automatically parsed.

Router Handler
export default defineEventHandler(async (event) => {
  const data = await $fetch('https://ungh.cc/orgs/unjs/repos')

  return data
})

You can pass a generic type to the $fetch function to get a better type inference.

Router Handler
import { Repo } from '~/types'

export default defineEventHandler(async (event) => {
  const data = await $fetch<Repo[]>('https://ungh.cc/orgs/unjs/repos')

  return data
})

You can pass many options to the $fetch function like the method, headers, body, query, etc.

Router Handler
import { Repo } from '~/types'

export default defineEventHandler(async (event) => {
  const data = await $fetch<Repo[]>('https://api.github.com/markdown', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: {
      text: 'Hello **world**!'
    }
  })

  return data
})

See more about the usage of the $fetch function in the ofetch documentation.

In-Server fetch

You can also use the $fetch function to make internal requests to other handlers.

Router Handler
export default defineEventHandler(async (event) => {
  const data = await $fetch('/api/users')

  return data
})

In reality, no fetch request is made and the handler is directly called, thanks to unenv. This is useful to avoid making HTTP request overhead.