Skip to main content

Function Anatomy

Learn about the structure and components of an Invoke function.

Simple Function

The most basic function exports a single handler that receives a request and sends a response.

export default async function handler(req, res) {
res.json({ message: 'Hello, World!' })
}

Export Formats (Bun)

JavaScript and TypeScript support several export styles:

// Standard function
export default function handler(req, res) { res.json({ ok: true }) }

// Arrow function
export default (req, res) => { res.json({ ok: true }) }

// Async function
export default async function handler(req, res) {
const data = await fetch('https://api.example.com/data').then(r => r.json())
res.json(data)
}

// Async arrow
export default async (req, res) => {
const result = await someAsyncOperation()
res.json(result)
}

Multi-Route App (Router)

For functions that handle multiple routes, export a Router instance (Bun) or use attribute-based routing (C#).

const router = new Router()

router.get('/', (req, res) => {
res.json({ message: 'Hello' })
})

router.get('/users/:id', (req, res) => {
res.json({ id: req.params.id })
})

router.post('/users', async (req, res) => {
const user = await createUser(req.body)
res.status(201).json(user)
})

// Catch unmatched routes
router.use((req, res) => {
res.status(404).json({ error: 'Not found' })
})

export default router

See the Router API (Bun) for complete Bun/JS routing documentation.

Realtime Handler

For Socket.IO-style event-driven functions:

const ns = new RealtimeNamespace('/chat')

ns.socket.on('$connect', function () {
ns.socket.join('lobby')
ns.socket.emit('welcome', { message: 'Hello!' })
})

ns.socket.on('message', function (data) {
ns.socket.to('lobby').emit('message', { from: ns.socket.id, text: data.text })
})

ns.socket.on('$disconnect', function (reason) {
console.log('Disconnected:', ns.socket.id, reason)
})

export default ns

See the Realtime API (Bun) for complete Bun/JS realtime documentation.

Request Object

export default function handler(req, res) {
console.log(req.method) // 'GET', 'POST', etc.
console.log(req.path) // '/some/path'
console.log(req.query) // { key: 'value' }
console.log(req.body) // Parsed JSON/form data
console.log(req.headers) // Request headers
console.log(req.cookies) // Parsed cookies
}

See the Request API (Bun) for complete documentation.

Response Object

export default function handler(req, res) {
res.json({ success: true }) // JSON response
res.send('Hello World') // Text response
res.status(201).json({ created: true }) // With status code
res.sendFile('/path/to/file.pdf') // File response
}

See the Response API (Bun) for complete documentation.

Using Modules / Packages

Standard Node.js-compatible modules are available via import:

import crypto from 'crypto'
import fs from 'fs'
import path from 'path'

export default function handler(req, res) {
const hash = crypto.createHash('sha256').update('data').digest('hex')
const content = fs.readFileSync(path.join(__dirname, 'data.txt'), 'utf8')
res.json({ hash, content })
}

Available built-in modules include crypto, fs, path, http, https, dns, zlib, stream, url, util, events, buffer, assert, timers, tls, net, and more. User code runs on the Bun runtime — see Bun API Reference for full compatibility.

KV Store

export default async function handler(req, res) {
// Global kv (no require needed)
await kv.set('counter', 42)
const value = await kv.get('counter')
res.json({ counter: value })
}

See KV Store API (Bun) for full documentation.

Package Structure

function.zip
├── index.js # Entry point (required)
├── package.json # Package metadata (required)
├── node_modules/ # Dependencies (optional)
│ └── lodash/
└── lib/ # Helper modules (optional)
└── utils.js
package.json
{
"name": "my-function",
"type": "module",
"main": "index.js",
"dependencies": {
"lodash": "^4.17.21"
}
}

Error Handling

export default async function handler(req, res) {
try {
const response = await fetch('https://api.example.com/data')
if (!response.ok) {
return res.status(response.status).json({ error: 'External API error' })
}
const data = await response.json()
res.json(data)
} catch (error) {
console.error('Function error:', error)
res.status(500).json({ error: 'Internal error', message: error.message })
}
}

Next Steps