在 Node.js 的后端环境中,Mongoose 是一个常用的 MongoDB ODM 库。在使用 Mongoose 时,常常会定义一个 Schema 来描述文档的结构,然后在模型中使用这个 Schema。在编写 Schema 的过程中,我们通常会定义一些字段和类型,但有时候我们可能会遇到一些问题:文档中保存了未定义的字段,这些字段可能是误打误入或者恶意的攻击。因此,在本文中,我们将介绍如何使用 Mongoose 禁止未定义的字段的保存。
代码示例
下面是一个简单的代码示例,使用了 Mongoose,定义了一个 User 的 Schema,并创建了一个用户:
----- -------- - -------------------- ----- ---------- - --- ----------------- ----- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- -- --- ----- ---- - ---------------------- ------------ ------ -- -- - ----- -------------------------------------------- - ---------------- ---- --- ----- ---- - --- ------ ----- -------- ------ -------------------- --------- ----------- ---- --- --- ----- ------------ ----------------- ----- --------------- -----
在上面的代码中,UserSchema 定义了三个字段:name、email 和 password。在创建用户时,我们还添加了一个 age 字段,但这个字段在 Schema 中并没有定义。
如果我们运行上面的代码,它会执行保存操作,但不会报错。如果我们再次查询数据库中的用户,就会发现 age 字段也被保存了。
为了禁止保存未定义的字段,我们可以通过设置 Schema 的 strict 选项为 true,从而禁用保存未定义的字段。
下面是修改后的代码示例:
----- -------- - -------------------- ----- ---------- - --- ----------------- ----- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- -- -- - ------- ---- --- ----- ---- - ---------------------- ------------ ------ -- -- - ----- -------------------------------------------- - ---------------- ---- --- ----- ---- - --- ------ ----- -------- ------ -------------------- --------- ----------- ---- --- --- --- - ----- ------------ - ----- ----- - --------------------------- - ----------------- ----- --------------- -----
在上面的代码中,我们使用了 strict 选项将 Schema 设置为 strict 模式。在 strict 模式下,Mongoose 不会保存任何未定义的字段,并且会在保存时触发 ValidationError 错误。
使用上面的代码示例进行测试,我们会看到在保存时触发了 ValidationError 错误,并且不会保存未定义的字段。这也提醒了我们要注意模型的定义,并且在模型中只定义必要的字段。
结论
在本文中,我们介绍了如何使用 Mongoose 禁止未定义的字段的保存。我们强烈建议在定义 Schema 时启用 strict 模式,以防止未定义的字段被保存。这样可以提高系统的安全性和稳定性。
在实际的开发过程中,我们应该对模型进行仔细的设计和定义,确保模型中只包含必要的字段,并且尽可能避免使用未定义的字段。这可以使我们的代码更加健壮和可靠。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670a300ed91dce0dc87f8737