快速验证程序验证导致typescript错误:request.query对象可能是';未定义';

快速验证程序验证导致typescript错误:request.query对象可能是';未定义';,typescript,express,express-validator,Typescript,Express,Express Validator,我正在使用express构建一个Node.js应用程序,我希望使用express validator对其进行改进。这是我第一次使用ExpressValidator,我不理解它引起的警告。它的文档也不是很详细 这是一个简化版本的段,在我添加验证之前,数据库调用已被替换为使用GET请求中的entry\u id返回响应 router.get( '/list_entries', function (req, res, next) { res.send(req.query.entry_id

我正在使用express构建一个Node.js应用程序,我希望使用express validator对其进行改进。这是我第一次使用ExpressValidator,我不理解它引起的警告。它的文档也不是很详细

这是一个简化版本的段,在我添加验证之前,数据库调用已被替换为使用GET请求中的
entry\u id
返回响应

router.get(
  '/list_entries',
  function (req, res, next) {
    res.send(req.query.entry_id)
  }
)
我添加了验证,以检查
条目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)
  }
)
它似乎运行良好,如果值超出范围,则会显示错误。
然而,这也在typescript中触发了一个警告,指出:
对象可能是“未定义的”
引用响应中的
req.query
。我不清楚验证是如何导致这种情况的,以及如何克服它(除了使用可选链接,如
req.query?.entry\u id
)。我想知道在哪里可以找到一些文档或工作示例来启发我。提前谢谢

就像TypeScript提到的,
req.query
可能是
未定义的
。例如,url中没有查询字符串。因此,为了确保它不是未定义的,您必须添加额外的检查。另外,不要忘记检查是否存在
req.query.entry\u id

函数expressCallback(req,res){
如果(请求查询){
if(请求查询条目id)res.send(请求查询条目id)
}
}
如果您不太喜欢将所有逻辑包装在
If
块中,则可以为
req.query
提供一个默认值,使其成为空对象:

函数expressCallback(req,res){
const query=req.query | |{}
if(query.entry\u id)res.send(query.entry\u id)
}

请看一下。

您的问题与Express Validator没有什么关系,只是打字脚本需要小心

它推断出它无法证明(在编译时)定义了
req.query
,因此它警告您
req.query.entry\u id
可能会在运行时导致类型错误

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

res.send(req.query?.entry_id)
这只是以下的简写:

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

这可能与您的
tsconfig.json
文件有关,而与express验证器无关。它可能由配置上的此设置“strictNullChecks”:true`引发。如果你将它设置为false,那么你应该是好的。。。它基本上告诉您在尝试使用它之前应该检查
req.query
是否为null/undefined(req.query.entry\u id)。谢谢,strictNullChecks在我的
tsconfig.json
中确实是正确的。当我不使用express validator时,我不明白为什么TS错误没有出现(在第一个示例的第4行)。我唯一的猜测是,express validator确实以某种方式修改了
req
。谢谢,这很清楚,我不明白为什么只有在添加express validator调用时才会触发此问题。在我给出的第一个示例中,TS错误没有出现,即使我以相同的方式使用
req.query.entry\u id
。可能它与express validator没有什么关系,但是,如果我不使用express validator(如我的第一个示例),我不会得到相同的TypeError。所以,在第一眼看到ExpressValidator确实触发了它-我想了解这种差异来自何处。不,它不是验证程序的某个特定功能。由于某种原因,
req.query
被声明为可能未定义,其余的是不可避免的。@Malvolio您在传播错误信息。它是验证器的一个特殊功能,它显式重写
express
类型定义,以将
query
声明为可选