Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该总是在express中编译Ajv模式吗?_Javascript_Node.js_Express_Ajv - Fatal编程技术网

Javascript 我应该总是在express中编译Ajv模式吗?

Javascript 我应该总是在express中编译Ajv模式吗?,javascript,node.js,express,ajv,Javascript,Node.js,Express,Ajv,我想使用验证我的express应用程序的请求正文 要使用验证器,我们首先需要编译要测试的模式,然后运行验证,如下所示: const Ajv=require('Ajv'); const ajv=新ajv(); 常量模式={ 类型:“对象”, 必需:[“用户名”,“密码”], 特性:{ 用户名:{ 键入:“字符串”, 最小长度:3, }, 密码:{ 键入:“字符串”, 最小长度:8, }, }, }; /*我们想要验证的是什么*/ 常数体={ 用户名:“johndoe”, 密码:“机密” }; /*

我想使用验证我的
express
应用程序的请求正文

要使用验证器,我们首先需要编译要测试的模式,然后运行验证,如下所示:

const Ajv=require('Ajv');
const ajv=新ajv();
常量模式={
类型:“对象”,
必需:[“用户名”,“密码”],
特性:{
用户名:{
键入:“字符串”,
最小长度:3,
},
密码:{
键入:“字符串”,
最小长度:8,
},
},
};
/*我们想要验证的是什么*/
常数体={
用户名:“johndoe”,
密码:“机密”
};
/*我们编译验证器*/
const validate=ajv.compile(schema.query)
/*我们测试数据,看它是否有效*/
const valid=validate(正文)

我应该在调用端点时始终编译验证器,并将其包含在路由中,还是可以将编译过程留在路由正文之外?

您应该在路由处理程序之外编译一次验证器,并在处理程序中重用已编译的模式


这将提高性能-您只需要在它发生更改时编译它。

您应该在路由处理程序之外编译它一次,并在处理程序中重用编译后的架构


这将提高性能-您只需要在它发生变化时编译它。

在尝试Josh Wulf的答案后,我确认它可以在路由处理程序之外编译验证器

尽管它按预期工作,并且可以在路由处理程序之外编译,但我注意到它有一个缺点

了解验证器检测到哪些错误的方法是调用
validate.errors

var validate=ajv.compile(模式);
var valid=验证(数据);
如果(!有效){
console.log(validate.errors);
}
因此,我们不应该在路由处理程序之外编译验证器,因为可能存在并发问题


由于验证程序在同一路由的不同请求中是相同的,访问验证程序的
errors
属性可能会返回另一个客户端的错误。

在尝试Josh Wulf的答案后,我确认它可以在路由处理程序之外编译验证程序

尽管它按预期工作,并且可以在路由处理程序之外编译,但我注意到它有一个缺点

了解验证器检测到哪些错误的方法是调用
validate.errors

var validate=ajv.compile(模式);
var valid=验证(数据);
如果(!有效){
console.log(validate.errors);
}
因此,我们不应该在路由处理程序之外编译验证器,因为可能存在并发问题


由于验证程序在同一路由的不同请求中是相同的,访问验证程序的
errors
属性可能会返回另一个客户端的错误。

我是否可以将
编译
放在同一个文件中,在路由处理程序的外部和前面?是的,您当然可以。尽管这可以提高性能,它有一个很大的并发问题。请查看我的答案以了解详细信息,我是否可以将
编译
放在同一个文件中,在路由处理程序之外和之前?是的,您当然可以。虽然这可以提高性能,但它存在很大的并发问题。请查看我的答案以了解详细信息