【问题标题】:Truly strictly typed API workflow - How to write robust API?真正严格类型化的 API 工作流 - 如何编写健壮的 API?
【发布时间】:2021-02-10 04:15:01
【问题描述】:

我尝试了很多不同的工具和框架,我想使用一些东西。真正用 Nodejs 和 Typescript 严格输入,但似乎什么都不是?

例如路由系统:

我尝试过 Meteor 和 NestJS 之类的框架,这些框架真的很难扩展,如果缺少某个功能,你将永远无法在保持所有类型的同时在其之上开发一些东西。

我已经掌握了 Nuxt、Next 和 Sapper 等框架。但是没有真正输入,或者以一种奇怪的方式输入。

所以我选择了 Express JS,我可以输入自己的路线并编写自己的方法和类来扩展它。这比我以前尝试过的任何其他方法都容易。

但路由系统只是工作 API 的一部分。现在我需要将我的路线与我的数据库链接起来,当然,我需要随身携带一个 ORM。但是事件 TypeORM 或 Sequelize-Typescript 并不是真正类型化的。 sequelize-typescript 中的某些方法(例如“User.create({//Not typed})”)不提供自定义类型来帮助我填充此方法。

而在ORM之后,就轮到认证、数据输入,甚至是客户端了。

Typescript 很棒,但是所有“使用 typescript”的东西仍然会有一些动态数据层,需要在编写代码时手动检查。

你如何处理这个?当您制作应用程序时,您是否总是在辅助屏幕中检查您的类型和接口?当您需要在界面中添加新字段时,您如何跟踪使用它的应用程序的每个部分(路由、客户端、数据库、验证)?

我只是不想开始编写我的 API,却发现它很难修改、改进或调试(我可能会有超过 25 个实体,它们之间有超过 100 个关系)。

【问题讨论】:

  • 你不能,我的意思是不能,做你想做的事。它失败了 overoveroverover... 我们不这样做是有原因的。您可以选择(假设您可以选择)带有模式的协议(avro、协议缓冲区、带有 DTD 的 XML),这样您就知道自己得到了什么,并且尽可能接近。但是你...
  • ...总是需要处理杂乱、稀疏、不规则的数据。您将必须始终对其进行规范化。您将不得不经常处理第 3 方 API,这些 API 可能会或可能不会分享您对什么构成安全性、API 合同意味着什么、或者是否在数据结构中添加密钥是/应该算作突破性的变化。话虽如此,这是一个意见问题,并不适合 SO。
  • TypeScript 不是运行时类型系统。它是一个开发时实用程序,用于提醒您对象模式和函数签名。当您的代码运行时,它就是 PURE JS。请记住,TypeScript 是一种“可擦除”语法,这意味着它会在您编译代码时消失。
  • 也就是说,我已经开始使用并享受这个库来检查对象(例如我在 API 调用中收到的请求负载)是否与预期的接口匹配。 npmjs.com/package/typescript-is

标签: node.js typescript api rest


【解决方案1】:

您可以通过定义模型并将其包含在架构定义中来使您的 TypeORM 实体类型安全(来自:https://typeorm.io/#/separating-entity-definition

import {EntitySchema} from "typeorm";

export interface Category {
    id: number;
    name: string;
}

export const CategoryEntity = new EntitySchema<Category>({
    name: "category",
    columns: {
        id: {
            type: Number,
            primary: true,
            generated: true
        },
        name: {
            type: String
        }
    }
});

【讨论】:

  • 电线呢?
  • @JaredSmith 我想我不知道什么是“电线”。能举个例子吗?
  • 在这种情况下,我指的是像您的 ISP 使用的字面物理线路。因此,您的 express 应用程序具有强类型的 ORM 接口到您的数据库,然后一些网页或移动应用程序或其他服务通过 HTTP 请求访问它。你怎么打字?注:那些其他的东西可能是用完全不同的语言和完全不同的类型系统编写的。
  • 在本地应用中使用 DTO 将 API 类型映射到本地类型。
  • 至于值不值得,我想只有你可以根据你的情况来回答这个问题。对于我从事的项目,我使用主要是内部编写的 API。所以,如果我们保持我们的项目引用是最新的,那么如果/当类型定义发生变化时,我们可以在编译时发现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多