【问题标题】:Express-validator validation causes typescript error: request.query Object is possibly 'undefined'Express-validator 验证导致打字稿错误:request.query 对象可能是“未定义”
【发布时间】:2021-07-19 02:01:18
【问题描述】:

我正在使用 express 构建一个 Node.js 应用程序,我想使用 express-validator 对其进行改进。这是我第一次使用 express-validator,我不明白它引起的警告。它的文档也不是很冗长。

这是我添加验证之前的简化版本,数据库调用已被替换为从 GET 请求中返回带有 entry_id 的响应。

router.get(
  '/list_entries',
  function (req, res, next) {
    res.send(req.query.entry_id)
  }
)

我添加了验证以检查entry_id 是否在req.query 中给出并且在有效范围内。:

router.get(
  '/list_entries',
  query('entry_id').isInt({ min: 1 }),
  function (req, res, next) {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() })
    }
    res.send(req.query.entry_id)
  }
)

它似乎运行良好,如果值超出范围,则会显示错误。 但是,这也触发了打字稿中的警告:Object is possibly 'undefined' 在响应中引用req.query。我不清楚验证是如何导致这种情况的,以及如何克服它(除了使用像req.query?.entry_id 这样的可选链接)。我想知道在哪里可以找到一些文档或工作示例来启发我。提前致谢!

【问题讨论】:

  • 这可能与您的 tsconfig.json 文件有关,而不是 express-validator。它可能会通过您的配置中的此设置“strictNullChecks”:true 引发。如果你将它设置为 false,那么你应该很好......它基本上告诉你在尝试使用它之前应该检查 req.query 是否为空/未定义(req.query.entry_id)
  • 谢谢,在我的tsconfig.json 中,strictNullChecks 确实是正确的。当我不使用 express-validator 时,我看不出为什么没有出现 TS 错误(在第一个示例中的第 4 行)。我唯一的猜测是 express-validator 确实以某种方式修改了req

标签: typescript express express-validator


【解决方案1】:

就像 TypeScript 提到的那样,req.query 可能是 undefined。例如,当 url 中没有查询字符串时就是这种情况。因此,要确保它不是undefined,您必须添加额外的检查。另外不要忘记检查req.query.entry_id的存在:

function expressCallback (req, res) {
  if (req.query) {
    if (req.query.entry_id) res.send(req.query.entry_id)
  }
}

如果您不喜欢将所有逻辑包装在 if 块中,则可以将默认值设置为 req.query 为空对象:

function expressCallback (req, res) {
  const query = req.query || {}

  if (query.entry_id) res.send(query.entry_id)
}

看看playground

【讨论】:

  • 谢谢,很清楚,我不明白为什么只有添加 express-validator 调用才会触发此问题。在我给出的第一个示例中,没有出现 TS 错误,即使我以相同的方式使用 req.query.entry_id
【解决方案2】:

您的问题与 Express Validator 无关,只是 Typescript 小心。

它的理由是它无法证明(在编译时)req.query 已定义,因此它警告您 req.query.entry_id 可能会在运行时导致 TypeError。

最简单的解决方案是这样写:

res.send(req.query?.entry_id)

这只是以下的简写:

res.send(req.query === undefined ? undefined : req.query.entry_id)

【讨论】:

  • 也许它与 express 验证器没什么关系,但是,如果我不使用 express 验证器(如我的第一个示例),我不会得到相同的 TypeError。因此,乍一看 express 验证器确实触发了它 - 我想了解这种差异来自哪里。
  • 不,这不是验证器的某些特定功能。出于某种原因,req.query 被声明为可能未定义,其余的都是不可避免的。
  • @Malvolio 你在传播错误信息。它是验证器的一个特殊功能,它显式覆盖 express 类型定义以将 query 声明为可选
猜你喜欢
  • 2019-07-30
  • 2021-12-21
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2019-12-24
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多