【问题标题】:how validation works in mongoose验证如何在猫鼬中工作
【发布时间】:2017-12-08 07:10:41
【问题描述】:

我正在阅读猫鼬的文档:http://mongoosejs.com/docs/guide.html

据说在将文档保存到数据库之前进行验证。

要关闭此功能,我们必须将 option: 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,我无法理解使用 validate 的根本原因?有人可以澄清一下上面提供的代码是如何工作的吗?

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    validateBeforeSave,顾名思义,在将 mongoose 对象持久化到数据库之前对其进行验证。这是一个模式级别的检查,如果未设置为 false,它将验证每个文档。它包括内置的(如数字不能包含字符串或必填字段应该存在等)和自定义的验证。

    validate 也一样,只是它与以后保存文档无关。它是您调用的对象上的方法,例如course.validate(callback),并通过回调中的 err 了解对象是否有效。

    两者都在做同一件事,但在不同的时间和不同的层次上。此外,两者并不相互排斥,因此不需要为另一个工作而设置一个。

    至于validate的用例,单元测试就是一个例子。您可能希望测试您的验证器,而无需模拟save 或设置测试数据库。我相信该示例正在尝试做类似的事情,尽管不是以结构化的方式。

    【讨论】:

      【解决方案2】:

      正如您所说,猫鼬会在保存操作之前启动验证,但在某些情况下,您希望在不保存的情况下验证文档架构。为此,您可以直接使用 validate 方法。 您在教程中的示例向我们展示了表示单元测试的一段代码。因此,例如,我们可以检查生成某些模型以保存而不保存他的方法。 当您有许多保存和依赖项的复杂操作流程时,验证方法也可以提供帮助。例如,您想以适当的结构保存用户仪表板模型,但首先要保存用户配置文件。使用 validate 方法,例如错误的仪表板结构,您可以在保存用户配置文件之前检查请求并抛出异常。

      【讨论】:

        【解决方案3】:

        在示例代码中,他们使用的是 Async Custom Validator,如果您检查一下,您会更好地理解:http://mongoosejs.com/docs/validation.html#built-in-validators

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

        【讨论】:

        • 谢谢,文档里很容易迷路
        • Async Custom Validator 部分显然是错误的并且具有误导性。该代码甚至没有使用自定义验证器,更不用说异步验证器了。测试的两个验证是 requiredminLength,它们是 mongoose 内置的,绝对不是异步的。
        • @TalhaAwan 请自行查看文档和示例代码
        • 在您分享的文档中,请参阅 Built-in Validators 下。你会发现requiredmaxLength 验证器。 1)这些不是自定义的 2)这些不是异步的。这正是上面代码中测试的两个验证器。
        • 你说的有一部分是对的,但也有其他的验证,不仅仅是它们,例如验证标题,因此它是自定义验证器。如果它不是异步的,代码的作者将使用 .validateAsync() 而不是 .validate()
        猜你喜欢
        • 2021-06-20
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 2016-03-27
        • 2014-12-28
        • 2015-04-14
        • 2020-03-26
        • 1970-01-01
        相关资源
        最近更新 更多