Skip to content

Response

Once the fetch method is called, Eden Treaty return a promise containing an object with the following properties:

  • 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 headers

Once returned, you must provide error handling to ensure that the response data value is unwrapped, otherwise the value will be nullable. Elysia provides a error() helper function to handle the error, and Eden will provide type narrowing for the error value.

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 the error is handled, type will be unwrapped
    // type: string
    return data
}

By default, Elysia infers error and response type to TypeScript automatically, and Eden will be providing auto-completion and type narrowing for accurate behavior.

TIP

If the server responds with an 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 interpret a stream response as AsyncGenerator allowing us to use for await loop to consume the stream.

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
)

Contributors

The avatar of contributor named as saltyaom saltyaomThe avatar of contributor named as Samuel Goldenbaum Samuel GoldenbaumThe avatar of contributor named as bogeychan bogeychan
The avatar of contributor named as Abutalib (Barish) Namazov Abutalib (Barish) Namazov

Changelog