将 Joi 模式与 Mongoose 模式一起使用?

Posted

技术标签:

【中文标题】将 Joi 模式与 Mongoose 模式一起使用?【英文标题】:Using Joi schemas alongside Mongoose schemas? 【发布时间】:2019-01-06 20:08:28 【问题描述】:

我想阻止将用户输入插入 MongoDB。 我想正确验证用户输入。

Joi 提供基于模式的验证来测试用户输入。 实际上听起来不错。

Mongoose 本身也有模式,有什么区别?

使用 Joi 架构并使用 mongojs 插件而不是 Mongoose 怎么样?

【问题讨论】:

【参考方案1】:

Mongoose 和 Joi 的架构之间的区别

Mongoose 的架构:您可以在此处定义模型以及它将接受的字段

例如。

const Schema = require('mongoose').Schema;
const UserSchema = new Schema (
  username: String
  email: String
)
const User = mongoose.module("user", UserSchema))

这里你说 User 模型将只接受用户名和电子邮件,并且两者都将是字符串。


Joi 的架构: 您可以在此处定义验证规则,以在创建数据文档之前验证接收到的数据。 例如。

const receivedData = username: "John Doe", email: "doe.john@gmail.com"
const Joi = require('joi');
const schema = Joi.object().keys(
    username: Joi.string().alphanum().min(3).max(30).required(),
    email: Joi.string().email()
)
const result = Joi.validate(receivedData, schema)

这就是您使用 Joi 架构定义规则的方式

username 字段必须是字符串、字母数字,长度在 3 到 30 之间 email 字段必须是字符串和电子邮件

结果将以对象的形式存储在result常量中。


而且我之前没有使用过mongojs,但 Joi 不会转播 Mongoose。所以我想使用monojs 会很好。

【讨论】:

您解释了区别,但是否有理由同时使用两者(我见过几个例子,两者都用于验证用户输入)? 同时使用两者的原因 - 特定级别的验证。通过 mongoose 模型方案验证,我们可以在 应用程序级别 验证数据,因此在将其持久化到数据库之前。使用 Joi,我们可以在 请求级别 验证数据。所以我们不至于数据持久化,但我们在此之前停止,在将请求对象放入数据库的逻辑之前。

以上是关于将 Joi 模式与 Mongoose 模式一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON-Schema 定义模式并使用 Mongoose?

有没有办法合并 Joi 模式?

无法将猫鼬虚拟与打字稿一起使用

无法将猫鼬虚拟与打字稿一起使用

将模糊搜索与猫鼬一起使用时出现打字稿错误

将模糊搜索与猫鼬一起使用时出现打字稿错误