gpt4 book ai didi

node.js - 如何使用 TypeScript 将输入 JSON 对象转换为 Node.JS 中的模型类?

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:51 25 4
gpt4 key购买 nike

我正在使用 TypeScript 和 Express 框架编写 Node.js 服务器。这就是我的 Controller 和路线的样子:

  export class AuthController {

public async signUpNewUser(request: Request, response: Response) {
...
}
}

如何接收模型类而不是像 ASP.NET 中的请求类型?像这样的东西:

public async signUpNewUser(input: SignUpModel, response: Response) {

这是个好主意吗?我不确定这是 Node.JS 中的常见方法我只是想确保每次都获得相同的模型,并编写与该模型相关的代码,而不是在动态 JSON 对象上。

我的建议是在路线开始时转换为强类型模型,但我不确定这是一个好方法。

有人有针对这种情况的解决方案吗?

最佳答案

How can I receive a model class instead Request type like in ASP.NET

这对我的项目(和工作)来说是一个永久的痛苦,最终我们决定构建一个具有自己的默认错误处理和身份验证 header 检查的自定义路由器。这种模式的技巧是保持轻量级,因为这仍然是表达方式,而中间件才是事情应该发生的地方 - 这个包装器只是为我们提供了一种方法,可以根据我们实际使用的中间件将表达请求转换为正确形状的类型。

这是一个简化的示例,其想法是您可以通过传递接口(interface)(或内联类型形状)来指定 req 和 res 的形状,并让 typescript 强制返回形状。

包装类示例:

import * as express from 'express';

export type ExpressMethods = "get" | "post" | "put" | "delete" | "patch";

export type JsonRouteInput<RequestBody, RouteParams, QueryParams> = {
body: RequestBody;
params: RouteParams;
query: QueryParams;
};

export type JsonRouteHandler<
RequestBody,
RouteParams,
QueryParams,
ResponseBody
> = (
request: JsonRouteInput<RequestBody, RouteParams, QueryParams>
) => Promise<ResponseBody> | ResponseBody;

export class JsonRouter {
router = express.Router();
private addHandler<M extends ExpressMethods>(
method: M,
...middleware: express.RequestHandler[]
) {
this.router.use(...middleware);
}

get route(): {
[K in ExpressMethods]: <
RequestBody,
ResponseBody,
RouteParams = never,
QueryParams = never
>(
path: string,
handler: JsonRouteHandler<
RequestBody,
RouteParams,
QueryParams,
ResponseBody
>
) => JsonRouter
} {
const addables = {} as any;
(["get", "post", "put", "delete", "patch"] as ExpressMethods[]).forEach(
<RequestBody, ResponseBody, RouteParams = never, QueryParams = never>(
method
) => {
addables[method] = (
path: string,
handler: JsonRouteHandler<
RequestBody,
RouteParams,
QueryParams,
ResponseBody
>
) => {
this.router[method](path, async (req, res) => {
try {
const responseBody: ResponseBody = await handler({
body: req.body,
params: req.params,
query: req.query
});
res.json(responseBody);
} catch (err) {
// do your standard error handling or whatever
res.status(500).end("ow");
}
});
return this;
};
}
);
return addables;
}
}

然后使用它

const jsonRouter = new JsonRouter().route.get<{ request: number }, { response: number }>(
"/hello-world",
req => {
return { response: req.body.request + 1 }; // type-checked result
}
);

这绝对可以更进一步 - 我有一些原型(prototype),可以让我们半流畅地构建请求/响应主体的形状。该策略的长期目标是让我们为前端生成一个 typescript 休息客户端,生成与我们用于注释的类型相匹配的输入验证,并强制响应是正确的类型 - example router using this strategy to build the type dynamically

编辑:将此示例插入快速服务器

const app = express();

// custom middleware goes here

app.use('/', jsonRouter.router);

app.listen(8000)

关于node.js - 如何使用 TypeScript 将输入 JSON 对象转换为 Node.JS 中的模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51995430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com