首页 > 其他分享 >[Typescript] Create a Type-Safe Request Handler with Zod and Express

[Typescript] Create a Type-Safe Request Handler with Zod and Express

时间:2023-03-02 16:59:34浏览次数:43  
标签:body Typescript Zod res Create req import query config

import express, { RequestHandler } from 'express';
import { it } from 'vitest';
import { z, ZodError } from 'zod';
import { Equal, Expect } from '../helpers/type-utils';
import { ParsedQs } from 'qs';

const makeTypeSafeHandler = <
  TQuery extends ParsedQs = any,
  TBody extends Record<string, any> = any
>(
  config: {
    query?: z.Schema<TQuery>;
    body?: z.Schema<TBody>;
  },
  handler: RequestHandler<any, any, TBody, TQuery>
): RequestHandler<any, any, TBody, TQuery> => {
  return (req, res, next) => {
    const { query, body } = req;
    if (config.query) {
      try {
        config.query.parse(query);
      } catch (e) {
        return res.status(400).send((e as ZodError).message);
      }
    }
    if (config.body) {
      try {
        config.body.parse(body);
      } catch (e) {
        return res.status(400).send((e as ZodError).message);
      }
    }
    return handler(req, res, next);
  };
};

const app = express();

it('Should make the query AND body type safe', () => {
  app.get(
    '/users',
    makeTypeSafeHandler(
      {
        query: z.object({
          id: z.string(),
        }),
        body: z.object({
          name: z.string(),
        }),
      },
      (req, res) => {
        type tests = [
          Expect<Equal<typeof req.query, { id: string }>>,
          Expect<Equal<typeof req.body, { name: string }>>
        ];
      }
    )
  );
});

it('Should default them to any if not passed in config', () => {
  app.get(
    '/users',
    makeTypeSafeHandler({}, (req, res) => {
      type tests = [
        Expect<Equal<typeof req.query, any>>,
        Expect<Equal<typeof req.body, any>>
      ];
    })
  );
});

 

标签:body,Typescript,Zod,res,Create,req,import,query,config
From: https://www.cnblogs.com/Answer1215/p/17172321.html

相关文章

  • [Typescript] Clean type
    constpick=<TObj,TKeysextends(keyofTObj)[]>(obj:TObj,picked:TKeys)=>{returnpicked.reduce((acc,key)=>{acc[key]=obj[key];returnacc......
  • vscode 配置typescript开发
    今天介绍如何用vscode开发typescript程序,开始前我们需要一点小小的配置:下载vscode,这个就不用说了,下面直接给出链接地址:vscode下载安装node.js.安装typescriptnod......
  • TypeScript 入门1:创建一个在Chrome上运行的TypeScript Demo
    概述目前使用TypeScript编写前端项目已成为趋势,所以搞一个运行在Chrome的demo来方便练习一下TypeScript相关语法。由于技术更新太快,会导致你在网上参考的例子可能已......
  • docker出现“Failing to start dockerd: failed to create NAT chain DOCKER”错误
    使用Windows的WSL2里面的Ubuntu安装docker之后,启动docker服务一直失败,提示Dockerisnotrunning。使用dockerd命令会出现如下错误:INFO[2023-03-01T18:22:07.565628800+0......
  • npm install 报错 The package-lock.json file was created with an old version of n
    1.报错截图: 2 报错原因:npm版本过高,解决方法见第如下npminpm@6-g检测npm-vnpm版本版本已经降低再进行npminstall的操作就不会报错了。......
  • TypeScript Map 对象
    TypeScriptMap对象Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为一个键或一个值。Map是ES6中引入的一种新的数据结构,可以......
  • TypeScript Array(数组)
    TypeScriptArray(数组)数组对象是使用单独的变量名来存储一系列的值。数组非常常用。假如你有一组数据(例如:网站名字),存在单独变量如下所示:varsite1="Google";vars......
  • TypeScript String(字符串)
    TypeScriptString(字符串)String对象用于处理文本(字符串)。语法vartxt=newString("string");或者更简单方式:vartxt="string";String对象属性下表列出了Stri......
  • TypeScript 联合类型
    TypeScript联合类型联合类型(UnionTypes)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。注意:只能赋值指定的类型,如果赋值其它类型就会报错。创建......
  • TypeScript 元组
    TypeScript元组我们知道数组中元素的数据类型都一般是相同的(any[]类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组。元组中允许存储不同类型的元素,元组可......