我正在阅读mongoose的文档:http://mongoosejs.com/docs/guide.html
据说在将文档保存到数据库之前进行验证。
要关闭此功能,我们必须将选项:validateBeforeSave 设置为 false 。
但是我有另一个不错的Node.js教程示例,他们只使用.validate,如下所示:
var course = new Course({});
course.validate(function(err) {
assert.ok(err);
assert.equal(err.errors['title'].kind, 'required');
course.title = 'Introduction to Computer Science';
assert.equal(course.title, 'Introduction to Computer Science');
var s = '0123456789';
course.title = '';
while (course.title.length < 150) {
course.title += s;
}
course.validate(function(err) {
assert.ok(err);
assert.equal(err.errors['title'].kind, 'maxlength');
++succeeded;
done();
});
});
我无法理解使用验证而不将 validateBeforeSave 选项设置为 false 的根本原因?有人可以澄清上面提供的代码是如何工作的吗?
答案 0 :(得分:0)
validateBeforeSave
,顾名思义,在将mongoose对象持久化到数据库之前验证它。这是模式级别检查,如果未设置为false,则将验证每个文档。它包括内置的(如数字不能包含字符串或必须存在的字段等)和自定义定义的验证。
validate
也是如此,只是不关心以后保存文档。它是您调用的对象上的方法,如course.validate(callback)
,并通过回调中的错误来了解对象是否有效。
两者都做同一件事,但在不同的时间和不同的水平。此外,两者并不相互排斥,因此不需要将其他人用于其他工作。
对于validate
的用例,单元测试就是一个例子。您可能希望测试验证器,而无需模拟save
或设置测试数据库。我相信这个例子是试图做那样的事情,虽然不是以结构化的方式。
答案 1 :(得分:0)
正如你所说mongoose在保存操作之前启动验证,但在某些情况下你想要验证文档架构而不保存。为此,您可以直接使用验证方法。 您在教程中的示例向我们展示了代表单元测试的代码片段。因此,例如,我们可以检查生成某些模型的方法,以节省而不保存。 当您有许多保存和依赖项的复杂操作流时,验证方法也可以提供帮助。例如,您希望使用适当的结构保存用户仪表板模型,但首先要保存用户配置文件。使用validate方法和例如错误的仪表板结构,您可以在保存用户配置文件之前检查请求并抛出异常。
答案 2 :(得分:0)
在示例代码中,他们使用异步自定义验证程序,如果您选中此选项,您会更好地理解:http://mongoosejs.com/docs/validation.html#built-in-validators
当标准验证不够时使用它们,这纯粹是我的观察,它通常用于测试以及一些测试框架和断言库。