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

标签 node.js typescript express

我想使用 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/

相关文章:

javascript - ExpressJS - 为通用 Nuxt 应用程序和 AngularJS SPA 提供服务

typescript - 方法的单独的公共(public)/私有(private)签名

javascript - 带有 API 和 MONGOOSE 的简单 Web SPA(ID 问题)

node.js - 使用 node.js 抓取需要身份验证的网站

node.js - 为什么作为响应 SIGINT 信号的回调调用的方法在进程终止之前没有完全完成?

angularjs - Angular $http.get 错误,意外 token

typescript 在 MacOS 上被错误识别为 MPEG 文件

c# - 使用 Angular : Unexpected token P in JSON at position 0 at JSON. 解析下载 .xls 文件(<匿名>)

node.js - 如何从 express 获取当前的 Windows 用户?

mysql - 同时执行查询并在所有查询准备就绪后返回