如何在mongoose

时间:2017-07-04 18:31:59

标签: javascript node.js mongoose

我正在阅读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 的根本原因?有人可以澄清上面提供的代码是如何工作的吗?

3 个答案:

答案 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

当标准验证不够时使用它们,这纯粹是我的观察,它通常用于测试以及一些测试框架和断言库。