快速验证程序验证导致typescript错误:request.query对象可能是';未定义';
我正在使用express构建一个Node.js应用程序,我希望使用express validator对其进行改进。这是我第一次使用ExpressValidator,我不理解它引起的警告。它的文档也不是很详细 这是一个简化版本的段,在我添加验证之前,数据库调用已被替换为使用GET请求中的快速验证程序验证导致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
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
声明为可选