Response
Once fetch method is called, Eden Treaty return an Promise with object as follows:
- data - returned value of the response (2xx)
- error - returned value from the response (>= 3xx)
- response
Response
- Web Standard Response class - status
number
- HTTP status code - headers
FetchRequestInit['headers']
- response's headers
Once returned, you must provide an error handling to ensure that value is truly returned to access the value, otherwise the value will be nullable.
typescript
import { Elysia, t } from 'elysia'
import { treaty } from '@elysiajs/eden'
const app = new Elysia()
.post('/user', ({ body: { name }, error }) => {
if(name === 'Otto')
return error(400, 'Bad Request')
return name
}, {
body: t.Object({
name: t.String()
})
})
.listen(3000)
const api = treaty<typeof app>('localhost:3000')
const submit = async (name: string) => {
const { data, error } = await api.user.post({
name
})
// type: string | null
console.log(data)
if(error)
switch(error.status) {
case 400:
// Error type will be narrow down
throw error.value
default:
throw error.value
}
// Once error is handle, type will be unwrapped
// type: string
return data
}
By default, Elysia will infers error and response type to TypeScript automatically, and Eden will be providing an auto-completion and type narrowing for accurate behavior.
TIP
If server response with HTTP status >= 300, then value will be always be null, and error will have a returned value instead.
Otherwise, response will be passed to data.
Stream response
Eden will will interpret a stream response from a generator function as AsyncGenerator
typescript
import { Elysia } from 'elysia'
import { treaty } from '@elysiajs/eden'
const app = new Elysia()
.get('/ok', function* () {
yield 1
yield 2
yield 3
})
const { data, error } = await treaty(app).ok.get()
if (error) throw error
for await (const chunk of data)
console.log(chunk)