【问题标题】:Using TypeScript with body-parser to read req.body properties使用 TypeScript 和 body-parser 来读取 req.body 属性
【发布时间】:2019-07-01 16:55:35
【问题描述】:

我正在使用 TypeScript 和 body-parser 中间件构建一个 Web 应用程序来解析 JSON 请求正文。当我尝试访问 Request.body 对象的属性时遇到类型错误。

例如,如果我尝试req.body.username,TypeScript 会抛出错误

Property 'username' does not exist on type 'ReadableStream<Uint8Array>'. 

我尝试过的事情:

  • 在访问username 属性之前为ReadableStream&lt;Uint8Array&gt; 声明一个自定义接口。
interface ReadableStream<Uint8Array> {
    username: string
}

TypeScript 告诉我 ReadableStream 已声明但从未使用过。无法弄清楚为什么会这样。

  • 将使用情况包装在 if 块中
if (req.body.hasOwnProperty('username')) {
    // Use req.body.username here
}

TypeScript 似乎不明白这意味着属性用户名存在。

  • 使用索引而不是点表示法
let p_username = req.body['username'];

这是我尝试的最后一件事,尽管它破坏了类型检查的意义。即使这样也行不通:

Element implicitly has an 'any' type because type 'ReadableStream<Uint8Array>' has no index signature.

看起来像这样读取请求正文内容是相当标准的用法,因此应该有一种简单的方法来解决这个问题。也许我错过了一些明显的东西。

【问题讨论】:

  • 我对您在此处的设置感到有些困惑。据我了解,express typings make 的类型为req.body,标记为any,所以应该没有类型限制。
  • @KevinRaoofi:你确定吗?我启用了严格的类型检查。尽管在 interface 中明确声明 body:any 似乎确实有效。
  • 是的,这就是我从here 得到的。我想我需要更多关于您正在做什么的背景信息,以便能够就您做错的事情向您提供反馈。

标签: typescript body-parser


【解决方案1】:

我在响应主体和转换为对象时遇到了类似的问题 产生错误:

<SampleType>res.body

并由此解决:

<SampleType>(<unknown>res.body)

我一直在寻找解决方案,但最终查看了 VSCode 提供的快速解决方案,即先转换为未知类型,然后再转换为您想要的类型。

【讨论】:

    【解决方案2】:

    您必须从 express 库中导入 Request 和 Response 的定义。

    在文件顶部:

    import { Request, Response } from 'express';
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多