gpt4 book ai didi

node.js - 使用 Typescript 自动验证请求的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 12:13:07 26 4
gpt4 key购买 nike

我想使用 Typescript 接口(interface)轻松验证后端请求。有没有办法让它发生?我想做的事的例子:

import { Request, Response } from 'express'

interface AuthenticateParams {
email: string
password: string
}

type AuthenticationRequest = Request & {body: AuthenticateParams}

const authenticate = async (req: AuthenticationRequest, res: Response) => {
if (typeof req.body !== AuthenticateParams) res.status(400).send('Invalid body')

// DO STUFF
let stuff

res.status(200).send(stuff)
}

export default authenticate

最佳答案

2022 年更新:
我偶然发现了Runtypes我认为这是一个很酷的解决方案。当你想到它时,一个很明显的问题:你在中间使用了一个解决方案,它会自动为你提供正确的类型和检查有效性的可能性。这比尝试从类型工作到验证要好得多,因为接口(interface)在运行时不存在,正如多次所说的那样。
原始答案:
是的,我知道接口(interface)在运行时不存在。我创建了这个解决方案,它验证我的输入并在我需要时给我输入错误。我认为我的标题有点误导,所以我还将标题更改为“使用 Typescript 自动验证请求的最佳方法是什么”。
这个想法是强制我为我希望用来验证后端端点的每个接口(interface)编写一个简单的模式。另外,为了尽量减少人为错误的可能性,我的 linter 类型检查 validatorObject 很重要。 .
验证参数.ts:

const validateParams: (targetObject: any, validatorObject: any) => boolean = (targetObject, validatorObject) => {
if (typeof targetObject !== typeof validatorObject) return false
if (typeof targetObject === 'object') {
let validObject = true
if (Array.isArray(targetObject)) {
for (let subObject of targetObject) {
validObject = validObject && validateParams(subObject, validatorObject[0])
}
} else {
for (let key of Object.keys(validatorObject)) {
if (typeof targetObject[key] === 'object') validObject = validObject && validateParams(targetObject[key], validatorObject[key])
if (typeof targetObject[key] !== typeof validatorObject[key]) validObject = false
}
}
return validObject
}
return true
}

export default validateParams
验证.ts
import { Request, Response } from 'express'
import validateParams from "./validateParams"

interface AuthenticateParams {
email: string
password: string
}

const validatorObject: AuthenticateParams = {
email: 'string',
password: 'string'
}

type AuthenticationRequest = Request & {body: AuthenticateParams}

const authenticate = async (req: AuthenticationRequest, res: Response) => {
if (!validateParams(req.body, validatorObject)) res.status(400).send('Invalid body')

// DO STUFF
let stuff

res.status(200).send(stuff)
}

export default authenticate
更新用户.ts
import { Request, Response } from 'express'
import validateParams from "./validateParams"

interface UpdateUserParams {
name: string
products: {
name: string
price: number
}[]
}

const validatorObject: UpdateUserParams = {
name: 'string',
products: [{name: 'string', number: 0}]
}

type AuthenticationRequest = Request & {body: UpdateUserParams}

const updateUser = async (req: UpdateUserParams, res: Response) => {
if (!validateParams(req.body, validatorObject)) res.status(400).send('Invalid body')

// DO STUFF
let stuff

res.status(200).send(stuff)
}

export default updateUser
这不是最漂亮的解决方案,但我喜欢它自动验证我的请求并且如果我忘记更新我的验证器对象也会给我错误。但是,是的,在运行时获得 Typescript 接口(interface)会很棒。

关于node.js - 使用 Typescript 自动验证请求的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58861115/

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