Node.js 真正严格类型化的API工作流-如何编写健壮的API?

Node.js 真正严格类型化的API工作流-如何编写健壮的API?,node.js,typescript,api,rest,Node.js,Typescript,Api,Rest,我尝试了很多不同的工具和框架,我想使用一些东西。真正严格地使用Nodejs和Typescript打字,但似乎什么都不是 例如,路由系统: 我尝试过Meteor和NestJS等框架,这些框架很难扩展,如果缺少一个功能,你将永远无法在上面开发一些东西,同时保持所有东西的类型化 我已经掌握了Nuxt、Next和Sapper等框架。但没有什么是真正的打字,或以一种奇怪的方式 所以我选择了expressjs,我可以键入自己的路由,编写自己的方法和类来扩展它。这比我以前试过的任何东西都容易 但是路由系统只是

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

例如,路由系统:

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

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

所以我选择了expressjs,我可以键入自己的路由,编写自己的方法和类来扩展它。这比我以前试过的任何东西都容易

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

在ORM之后,将轮到身份验证、数据输入,甚至客户端

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

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


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

您可以通过定义模型并将其包含在模式定义中(from:)使您的TypeForm实体类型安全

从“typeorm”导入{EntitySchema};
导出接口类别{
id:编号;
名称:字符串;
}
export const CategoryEntity=新的EntitySchema({
名称:“类别”,
栏目:{
身份证:{
类型:数字,
小学:对,
生成:真
},
姓名:{
类型:字符串
}
}
});

你不能,我的意思是不能,做你想做的事。它失败了,而且。。。我们不这么做是有原因的。您可以选择(假设您有选择权)一个带有模式的协议(avro、协议缓冲区、带DTD的XML),这样您就可以知道您得到了什么,这是您所能得到的最接近的。但是你……总是要处理凌乱、稀疏、难以控制的数据。你将不得不使它正常化,永远如此。您将不得不经常处理第三方API,这些API可能与您分享或不分享您对什么构成安全的看法,或者API合同的含义,或者在数据结构中添加密钥是否算是/应该算是破坏性更改。也就是说,这是一个意见问题,不适合SO。TypeScript不是运行时类型的系统。它是一个开发时实用程序,用于提醒您对象模式和函数签名。当代码运行时,它是纯JS的。请记住,TypeScript是一种“可擦除”语法,这意味着它在编译代码时消失。也就是说,我来利用并享受这个库来检查对象(例如,我在API调用中收到的请求负载)是否与预期的接口匹配。电线呢?@JaredSmith我想我不知道“电线”是什么。你能举个例子吗?在这种情况下,我指的是像你的ISP使用的文字物理线路。因此,您的express应用程序带有数据库的强类型ORM接口,然后一些网页、移动应用程序或其他服务通过HTTP请求点击它。你怎么打?注意:这些东西可能是用完全不同的语言和完全不同的类型系统编写的。在您的本地应用程序中使用DTO将API类型映射到本地类型。至于是否值得,我想只有您可以根据您的情况回答这个问题。对于我所从事的项目,我使用的API大多是内部编写的。因此,如果我们使项目引用保持最新,那么在类型定义更改时,我们可以在编译时发现错误。
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
        }
    }
});