使用 Hono RPC 实现优雅的错误处理和端到端类型安全

使用 hono rpc 实现优雅的错误处理和端到端类型安全

JavaScript 的错误处理机制,虽然提供了 try-catch 块和异常抛出,但在实际应用中常常显得不够简洁直观。 本文介绍一种借鉴 Golang 错误处理方式,结合 Hono RPC 实现更优雅、类型安全的错误处理方法。

传统 JavaScript 错误处理模式冗长且缺乏错误类型信息:

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

登录后复制

这种方式难以明确识别错误来源和类型。

Golang 式错误处理

Golang 的错误处理方式更直接,将错误作为返回值的一部分:

data, err := getdata()if err != nil {  // handle error}

登录后复制

这种方法允许立即处理错误,避免后续代码因错误而执行异常。 Supabase 的 supabase-js 库也采用了类似的模式。

Hono RPC 的优雅错误处理

Hono RPC 提供了一种类型安全且高效的错误处理机制:

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: "/" });};

登录后复制登录后复制

该函数通过 RPC 传递类型安全的 JSON 数据,并返回包含数据或错误的对象,其数据类型由 RPC 定义推断。

配置优雅的错误处理

按照 Hono 官方文档,配置错误处理程序:

Hono 错误处理程序配置

后端应返回包含错误信息和状态码的文本响应:

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(","), 400);  }  console.error(err);  return c.text("Something went wrong", 500);};// Add as an error handler on the Hono instanceconst app = new Hono();app.onerror(errorhandler);

登录后复制

根据 Hono 文档,抛出 HttpException:

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

登录后复制

前端错误处理程序配置

import { ClientResponse, hc } from "hono/client";import type { ApiRoutes } from "../../../backend/app";const client = hc("/");export const callrpc = async (  rpc: Promise): Promise => {  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 函数根据 RPC 定义自动推断数据类型,返回包含数据或错误的对象。

使用方法

端到端类型安全:

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: "/" });};

登录后复制登录后复制

缺点

后端仅返回错误文本和成功响应 JSON。偏离了 JavaScript 的传统错误处理方式。需要立即处理错误,可能并非所有场景都适用。

以上就是使用 Hono RPC 实现优雅的错误处理和端到端类型安全的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2644540.html

(0)
上一篇 2025年3月7日 07:16:54
下一篇 2025年3月6日 03:29:11

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用 AST 将 LLM 生成的片段精确地合并到现有代码文件中

    开源项目 aiCoder 现已发布,它为 AI 辅助 JavaScript 开发提供了一种革命性的方法!aiCoder 利用抽象语法树 (AST) 的优势,实现了比以往更智能、更可靠的 AI 代码片段与现有项目的整合。不同于容易造成冲突或代…

    2025年3月7日
    200
  • 反应服务器功能

    react 19 的服务器函数:在服务器端执行客户端引用的函数 本文介绍 React 19 中服务器函数的概念和使用方法。服务器函数是在客户端代码中引用,但在服务器端执行的函数。这简化了客户端与服务器端交互的流程。 以下是一个示例: ‘us…

    2025年3月7日 编程技术
    200
  • 释放 TypeScript 的力量:现代 Web 开发的关键概念

    引言 TypeScript 现已成为现代 Web 开发的基石,它巧妙地融合了 JavaScript 的灵活性与静态类型语言的可靠性。其强大的特性(例如接口、泛型和类型推断)使开发者能够编写更清晰、更易维护的代码,同时有效避免常见的运行时错误…

    2025年3月7日
    200
  • 测试用例:软件测试的支柱

    在软件开发领域,确保应用程序的质量和可靠性至关重要。测试用例作为测试过程的基石,提供了一种结构化的方法来验证功能并在整个软件生命周期中维护标准。本文探讨了您需要了解的有关测试用例、其重要性以及如何创建有效测试用例的所有信息。 什么是测试用例…

    2025年3月7日
    200
  • 了解 API 集成

    API集成:连接数字世界的桥梁,助力企业数字化转型 在当今数字经济时代,系统间的数据交换和功能共享至关重要。API集成作为现代软件架构的基石,正帮助企业实现各种应用和服务的无缝连接,从而提升运营效率和用户体验。 什么是API集成? API集…

    2025年3月7日
    200
  • 使用 html css 和 js 代码的导航栏图标选项 ui/ux

    Mobile Slider body { margin: 0; padding: 0; font-family: Arial, sans-serif; display: flex; justify-content: center; alig…

    编程技术 2025年3月7日
    200
  • 连续迁移

    本文介绍如何使用 sequelize 迁移来修改数据库表结构,特别是针对一个名为 metadata 的表进行列重命名和删除操作。 首先,我们有一个 Sequelize 模型定义: module.exports = (sequelize, s…

    2025年3月7日
    200
  • 在 JavaScript 中创建您自己的 Promise

    深入JavaScript Promise:异步回调机制详解及自定义Promise实现 本文将带您深入了解JavaScript Promise的异步回调机制,并指导您亲自动手创建一个符合Promise/A+规范的Promise类。我们将重点关…

    2025年3月7日
    200
  • 测试开发

    astro 博客模板安装与 dev.to 集成指南 本文将指导您安装 Astro 博客模板,并使用 Astro 5 的内容层 API 将 Dev.to 文章集成到您的网站中。 第一步:安装 Astro 博客模板 使用 npm 命令安装最新版…

    2025年3月7日
    200
  • 静态数据的 Sequelize 播种器

    关于如何在续集中进行播种的非常简短的帖子。 播种器是您在数据库中创建静态数据的方式,您希望这些数据无需用户创建即可显示。 这样做的目标是向此模型定义的待办事项应用程序中的非常基本的任务类型表添加一些静态数据: module.exports …

    2025年3月7日
    200

发表回复

登录后才能评论