Skip to content
Our Sponsors
Open in Anthropic

Response

fetch 메서드가 호출되면, Eden Treaty는 다음 속성을 포함하는 객체를 포함하는 Promise를 반환합니다:

  • data - 응답의 반환 값 (2xx)
  • error - 응답의 반환 값 (>= 3xx)
  • response Response - Web Standard Response 클래스
  • status number - HTTP 상태 코드
  • headers FetchRequestInit['headers'] - 응답 헤더

반환되면 응답 데이터 값이 unwrap되도록 에러 처리를 제공해야 하며, 그렇지 않으면 값이 nullable이 됩니다. Elysia는 에러를 처리하기 위한 error() 헬퍼 함수를 제공하며, Eden은 에러 값에 대한 타입 축소를 제공합니다.

typescript
import { Elysia, t } from 'elysia'
import { treaty } from '@elysiajs/eden'

const app = new Elysia()
    .post('/user', ({ body: { name }, status }) => {
        if(name === 'Otto') return status(400)

        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
    })

    // 타입: string | null
    console.log(data)

    if (error)
        switch(error.status) {
            case 400:
                // 에러 타입이 축소됩니다
                throw error.value

            default:
                throw error.value
        }

    // 에러가 처리되면 타입이 unwrap됩니다
    // 타입: string
    return data
}

기본적으로 Elysia는 errorresponse 타입을 TypeScript에 자동으로 추론하며, Eden은 정확한 동작을 위한 자동 완성과 타입 축소를 제공합니다.

TIP

서버가 HTTP 상태 >= 300로 응답하면 값은 항상 null이 되고, error는 반환된 값을 가집니다.

그렇지 않으면 응답이 data로 전달됩니다.

스트림 응답

Eden은 스트림 응답이나 Server-Sent EventsAsyncGenerator로 해석하여 for await 루프를 사용하여 스트림을 소비할 수 있습니다.

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
)
typescript
import { 
Elysia
,
sse
} from 'elysia'
import {
treaty
} from '@elysiajs/eden'
const
app
= new
Elysia
()
.
get
('/ok', function* () {
yield
sse
({
event
: 'message',
data
: 1
}) yield
sse
({
event
: 'message',
data
: 2
}) yield
sse
({
event
: 'end'
}) }) const {
data
,
error
} = await
treaty
(
app
).
ok
.
get
()
if (
error
) throw
error
for await (const
chunk
of
data
)
console
.
log
(
chunk
)
//

유틸리티 타입

Eden Treaty는 응답에서 dataerror 타입을 추출하기 위한 유틸리티 타입 Treaty.Data<T>Treaty.Error<T>를 제공합니다.

typescript
import { 
Elysia
,
t
} from 'elysia'
import {
treaty
, Treaty } from '@elysiajs/eden'
const
app
= new
Elysia
()
.
post
('/user', ({
body
: {
name
},
status
}) => {
if(
name
=== 'Otto') return
status
(400)
return
name
}, {
body
:
t
.
Object
({
name
:
t
.
String
()
}) }) .
listen
(3000)
const
api
=
treaty
<typeof
app
>('localhost:3000')
type
UserData
= Treaty.
Data
<typeof
api
.
user
.
post
>
// 또는 응답을 전달할 수도 있습니다 const
response
= await
api
.
user
.
post
({
name
: 'Saltyaom'
}) type
UserDataFromResponse
= Treaty.
Data
<typeof
response
>
type
UserError
= Treaty.
Error
<typeof
api
.
user
.
post
>
//