Node.js API请求/响应形状(包括JSON模式、TypeScript类型和运行时验证器)的单一真实来源?

Node.js API请求/响应形状(包括JSON模式、TypeScript类型和运行时验证器)的单一真实来源?,node.js,typescript,jsonschema,Node.js,Typescript,Jsonschema,我正在编写一个典型的Node.js REST服务,其端点接收JSON输入(作为POST正文)并返回JSON响应 我想要这三样东西: 定义端点的请求体和响应体的形状的JSON模式。(或Swagger文件,或任何适合为客户定义合同的文件。) TypeScript类型/接口完美地反映了JSON模式 我可以从处理程序调用运行时验证函数,以确保对象的形状正确。(一旦输入对象被验证,我的TypeScript代码应该知道它的接口。) 但我想要一个单一的真相来源,以避免这三个组成部分失去同步。所以我只想手工维护

我正在编写一个典型的Node.js REST服务,其端点接收JSON输入(作为POST正文)并返回JSON响应

我想要这三样东西:

  • 定义端点的请求体和响应体的形状的JSON模式。(或Swagger文件,或任何适合为客户定义合同的文件。)
  • TypeScript类型/接口完美地反映了JSON模式
  • 我可以从处理程序调用运行时验证函数,以确保对象的形状正确。(一旦输入对象被验证,我的TypeScript代码应该知道它的接口。)
  • 但我想要一个单一的真相来源,以避免这三个组成部分失去同步。所以我只想手工维护其中的一个(JSON模式或打字脚本)。其他两个组件应该由手写组件生成,并且不应该提交给版本控制


    我觉得现在这一定是一个相当普遍的要求,但我在网上找不到太多。也许我用错了搜索词来研究它。是否有任何框架或传统模式可以实现这一目标,即定义一个JSON API,严格验证输入、标准化的模式文档以及TypeScript中全类型对象的所有便利性?

    我假设您在前端和后端使用TypeScript

    自定义类型重用

    假设我们有一个包含三个主要文件夹的项目存储库:
    client
    server
    shared

    shared
    中有一个
    Types.ts
    文件,其中包含所有自定义类型定义。 例如:

    export interface Person {
      name: string;
      age: number;
    }
    
    现在,您可以从任何子文件夹导入这些类型,如
    \client\src\components\SomeComponent.ts
    或server
    \server\src\api\SomeRoute.ts
    与:

    因此,通过这种方式,您就可以在服务器和客户端的项目范围内使用类型定义

    JSON模型和文档生成

    您可以使用注释来记录api并生成降价文档

    另一种选择是。TypeDoc将TypeScript源代码中的注释转换为呈现的HTML文档或JSON模型。您可以通过只考虑相关api文件的方式对其进行配置

    运行时验证

    关于输入和输出的运行时验证,您可以为本文中由stereobooster解释的每种类型编写自己的验证函数:。或者你使用像这样的图书馆


    可能没有“一刀切”的工具,因为它在很大程度上取决于您想要实现的确切需求。因此,组合不同工具的工具集应该可以引导您走向正确的方向。如果您找到了适合自己的设置,请随时发布答案。

    这里的棘手之处在于JSON模式(或类似模式)和编程语言类型之间。并非总是有1:1的翻译。您可以使用QuyType在某个级别上执行此操作,但也可以认为它并不完美,OpenAPI和SWAGER负载模式与JSON模式不完全相同。
    import { Person } from `..\..\..\..\shared\Types.ts`;