Saya sentiasa mempunyai hubungan cinta-benci dengan pengendalian ralat JavaScript. Pergantungannya pada blok cuba-tangkap dan pengecualian melontar mungkin berkesan untuk orang lain, tetapi ia pastinya mengecewakan saya kadang-kadang.
Pertimbangkan corak pengendalian ralat JavaScript biasa ini:
async function fetchData(url) { try { const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); console.log(data); } catch (error) { console.error("Error fetching data:", error.message); } }
Itu banyak kod dan kami masih tidak tahu jenis ralatnya.
Pendapat saya ialah apabila menangani ralat, anda ingin tahu apa yang menyebabkan ralat, dari mana ia datang, dan jenis ralatnya dan atasinya dengan segera. Terutama apabila anda berada dalam persekitaran pelayan. Bagi saya
Saya lebih suka mengendalikan ralat seperti cara golang mengendalikannya, pada asasnya ralat sebagai nilai.
data, err := getData() if err != nil { // handle error }
Dengan cara ini anda menangani ralat dengan segera dan anda tidak perlu risau tentang kod yang lain berjalan jika terdapat ralat.
Supabase melakukan perkara yang sama dengan perpustakaan supabase-js mereka.
const { data, error } = await supabase.from("users").select("*"); if (error) { // handle error }
Mari kita bercakap tentang bintang utama rancangan itu
const onSubmit = async (data: SignUpSchema) => { const res = await callRpc(api.auth.signup.$post({ json: data })); if (res.error) { toast.error(res.error); return; } toast.success("Account created successfully"); router.navigate({ to: "/" }); };
Fungsi ini mungkin tidak kelihatan banyak, tetapi ia menyediakan parameter JSON selamat jenis melalui RPC. Ia mengendalikan semua ralat dan mengembalikan objek yang mengandungi sama ada data atau ralat, dengan jenis data disimpulkan daripada definisi RPC berdasarkan jenis pulangan titik akhir.
Sediakan Hono Rpc menggunakan dokumentasi rasmi
Halaman belakang hendaklah sentiasa mengembalikan respons teks dengan mesej ralat dan kod status.
export const errorHandler = (err: Error | HTTPException, c: Context) => { console.log("=== Caught Error ==="); if (err instanceof HTTPException) { return c.text(err.message, err.status); } if (err instanceof z.ZodError) { return c.text(err.errors.map((err) => err.message).join(",\n"), 400); } console.error(err); return c.text("Something went wrong", 500); }; // Add as a errorHandler on the Hono instance const app = new Hono(); app.onError(errorHandler);
Berdasarkan dokumentasi Hono anda harus membuang HTTPException seperti ini
import { HTTPException } from "hono/http-exception"; app.post("/", async (c, next) => { if (somethingWentWrong) { throw new HTTPException(401, { message: "Custom error message" }); } return c.json({ message: "Success" }); });
Sekarang kami tahu bahawa jika terdapat ralat, kami akan sentiasa menerima balasan teks dengan mesej ralat dan kod status.
import { ClientResponse, hc } from "hono/client"; import type { ApiRoutes } from "../../../backend/app"; const client = hc<ApiRoutes>("/"); export const callRpc = async <T>( rpc: Promise<ClientResponse<T>> ): Promise<{ data: T; error: null } | { data: null; error: string }> => { try { const data = await rpc; if (!data.ok) { const res = await data.text(); return { data: null, error: res }; } const res = await data.json(); return { data: res as T, error: null }; } catch (error) { return { data: null, error: (error as Error).message }; } }; export default client.api;
callRpc secara automatik akan membuat kesimpulan jenis data berdasarkan definisi RPC dan mengembalikan objek yang mengandungi sama ada data atau ralat.
Semuanya selamat dari apa yang anda hantar kepada apa yang anda terima
const onSubmit = async (data: SignUpSchema) => { const res = await callRpc(api.auth.signup.$post({ json: data })); if (res.error) { toast.error(res.error); return; } toast.success("Account created successfully"); router.navigate({ to: "/" }); };
Saya telah bekerja dalam pangkalan kod di mana ia disediakan seperti ini dan ia merupakan pengalaman pembangun paling lancar yang pernah saya miliki. Saya hanya di sini untuk berkongsi.
Atas ialah kandungan terperinci Pengendalian Ralat Elegan dan Keselamatan jenis Hujung ke Hujung dengan Hono RPC. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!