---
icon: IconDirectory
title: server
head.title: Server directory
---

# Server directory

The server directory is used to create any backend logic for your Nuxt application. It supports HMR and powerful features.

The `server/` directory contains API endpoints and server middleware for your project.

## API Routes

Nuxt will automatically read in any files in the `~/server/api` directory to create API endpoints.

Each file should export a default function that handles api requests. It can return a promise or JSON data directly (or use `res.end()`).

### Examples

#### Hello world

```js [server/api/hello.ts]
export default (req, res) => 'Hello World'
```

See result on <http://localhost:3000/api/hello>

#### Async function

```js [server/api/async.ts]
export default async (req, res) => {
  await someAsyncFunction()

  return {
    someData: true
  }
}
```

**Example:** Using Node.js style

```ts [server/api/node.ts]
import type { IncomingMessage, ServerResponse } from 'http'

export default async (req: IncomingMessage, res: ServerResponse) => {
  res.statusCode = 200
  res.end('Works!')
}
```

## Server Middleware

Nuxt will automatically read in any files in the `~/server/middleware` to create server middleware for your project.

These files will be run on every request, unlike [API routes](./api) that are mapped to their own routes. This is typically so you can add a common header to all responses, log responses or modify the incoming request object for use later on in the request chain.

Each file should export a default function that will handle a request.

```js
export default async (req, res) => {
  req.someValue = true
}
```

There is nothing different about the `req`/`res` objects, so typing them is straightforward.

```ts
import type { IncomingMessage, ServerResponse } from 'http'

export default async (req: IncomingMessage, res: ServerResponse) => {
  req.someValue = true
}
```
