Lewati ke konten

Detail Objek Error

Setiap kesalahan di Deserve mengalir lewat satu tempat. Lemparan route handler, kegagalan validasi, rute yang hilang, dan error berkas statis semua tiba di handler yang sama, tempat balasan khusus mengambil alih dari response default.

Penanganan Error Dasar

Tangani error dengan method router.catch():

typescript
import { 
Router
, type
HttpStatusCode
} from '@neabyte/deserve'
const
router
= new
Router
({
routes
: {
directory
: './routes' }
}) // Tangkap error dari rute mana pun
router
.
catch
((
ctx
,
error
) => {
// Balas dengan status error return
ctx
.
send
.
json
(
{
error
: 'Something went wrong',
statusCode
:
error
.
statusCode
,
pathname
:
error
.
pathname
,
method
:
error
.
method
,
url
:
error
.
url
}, {
status
:
error
.
statusCode
as
HttpStatusCode
}
) }) await
router
.
serve
(8000)

Struktur Objek Error

Error handler menerima objek context dan objek error dengan properti ini:

  • error.statusCode - status code HTTP (404, 500, dll.)
  • error.pathname - path request, misalnya /api/users
  • error.url - URL request lengkap
  • error.method - metode HTTP
  • error.error - instance Error asli
typescript
// Handler membaca objek error
router
.
catch
((
ctx
,
error
) => {
// Cadangan saat tidak ada pesan asli return
ctx
.
send
.
json
(
{
error
:
error
.
error
?.
message
|| 'An error occurred',
status
:
error
.
statusCode
,
pathname
:
error
.
pathname
,
method
:
error
.
method
,
url
:
error
.
url
}, {
status
:
error
.
statusCode
as
HttpStatusCode
}
) })

Skenario Error Umum

404 - Rute Tidak Ditemukan

typescript
router
.
catch
((
ctx
,
error
) => {
if (
error
.
statusCode
=== 404) {
return
ctx
.
send
.
json
(
{
error
: 'Route not found',
pathname
:
error
.
pathname
}, {
status
: 404 }
) } return null })

500 - Error Server

typescript
router
.
catch
((
ctx
,
error
) => {
if (
error
.
statusCode
=== 500) {
console
.
error
('Server error:',
error
.
error
)
return
ctx
.
send
.
json
(
{
error
: 'Internal server error'
}, {
status
: 500
} ) } return null })

Penanganan Error Route Handler

Tangkap error di route handler individual:

typescript
export async function 
POST
(
ctx
:
Context
):
Promise
<Response> {
try { const
data
= await
ctx
.
get
.
body
()
// Proses data... return
ctx
.
send
.
json
({
success
: true
}) } catch (
error
) {
return
ctx
.
send
.
json
(
{
error
: 'Failed to process request'
}, {
status
: 500
} ) } }

Error Validasi

Kontrak validasi yang ditolak melempar 422 Unprocessable Entity dan menjaga alasan kegagalan di error.error.cause sebagai array string. router.catch yang sama menanganinya, jadi membaca alasan itu mengubah kegagalan menjadi response tingkat field:

typescript
router
.
catch
((
ctx
,
error
) => {
if (
error
.
statusCode
=== 422 &&
Array
.
isArray
(
error
.
error
.
cause
)) {
// Munculkan tiap alasan validasi return
ctx
.
send
.
json
(
{
error
: 'Validation failed',
reasons
:
error
.
error
.
cause
},
{
status
: 422 }
) } return null })

Bagaimana sebuah kontrak menghasilkan alasan itu ada di Membaca Data Tervalidasi, yang menjaga aturan validasi di satu tempat dan pembentukan response di sini.

Dirilis di bawah Lisensi MIT.