在服务器端依赖 GraphQL 枚举验证
Relying on GraphQL enums validation in server-side
我的问题是最好的做法是什么?
我正在创建一个后端,它使用 GraphQL 作为 API,MongoDB 作为数据存储。
我知道 graphql 验证查询,特别是接收到的枚举。我的问题是是否足以依赖 GraphQL 输入枚举验证 或 我是否还应该在数据库级别添加验证。
我问这个是因为这似乎是一种不好的做法,而且是不必要的代码重复。
您将在两个地方定义可能的枚举类型,一个在 GraphQL 模式中,一个在 MongoDB 模型中。
例如:
gql 架构:
enum EyeColor {<br>棕色<br>蓝色<br>绿色<br>}
猫鼬模型:
new mongoose.Schema({ <br> eyeColor: { type: String, enum: ["BROWN", "BLUE", "GREEN"] }<br>});
我错过了什么吗?有没有更好的方法来声明枚举 with/in GraphQL 或 MongoDB?或者也许只依赖 GraphQL 就可以了?
我认为更好的方法是在 const 文件中定义枚举 EyeColor.const.js
:
const EYE_COLOR = {
BROWN: 'BROWN',
BLUE: 'BLUE',
GREEN: 'GREEN'
};
export {
EYE_COLOR
};
然后在你的猫鼬模型文件中:
import { EYE_COLOR } from '../../consts/EyeColor.const';
import _ from 'lodash';
new mongoose.Schema({
eyeColor: {
type: String,
enum: _.values(EYE_COLOR)
}
});
对于 graphql,您可以动态创建包含枚举的字符串
enum EyeColor {
BROWN
BLUE
GREEN
}
来自您位于 EyeColor.const.js
的对象(我没有编写代码,但它应该非常简单 - 为您的 const 中的每个键在枚举中创建另一个条目)。
这样你的常量只有一个定义。
在"best practice"方面,确实要看你以后的数据库使用情况:
它是否直接与您的 GraphQL 服务器耦合(并且只能通过该 GraphQL API 访问)?然后也许不需要复制该枚举检查。
但是,如果不通过 GraphQL 就可以访问 Mongo(例如,通过未来的模块或服务访问您的 mongoose 函数),那么您将需要保护数据猫鼬级别的模型。
我的问题是最好的做法是什么?
我正在创建一个后端,它使用 GraphQL 作为 API,MongoDB 作为数据存储。 我知道 graphql 验证查询,特别是接收到的枚举。我的问题是是否足以依赖 GraphQL 输入枚举验证 或 我是否还应该在数据库级别添加验证。
我问这个是因为这似乎是一种不好的做法,而且是不必要的代码重复。 您将在两个地方定义可能的枚举类型,一个在 GraphQL 模式中,一个在 MongoDB 模型中。
例如:
gql 架构:
enum EyeColor {<br>棕色<br>蓝色<br>绿色<br>}
猫鼬模型:
new mongoose.Schema({ <br> eyeColor: { type: String, enum: ["BROWN", "BLUE", "GREEN"] }<br>});
我错过了什么吗?有没有更好的方法来声明枚举 with/in GraphQL 或 MongoDB?或者也许只依赖 GraphQL 就可以了?
我认为更好的方法是在 const 文件中定义枚举 EyeColor.const.js
:
const EYE_COLOR = {
BROWN: 'BROWN',
BLUE: 'BLUE',
GREEN: 'GREEN'
};
export {
EYE_COLOR
};
然后在你的猫鼬模型文件中:
import { EYE_COLOR } from '../../consts/EyeColor.const';
import _ from 'lodash';
new mongoose.Schema({
eyeColor: {
type: String,
enum: _.values(EYE_COLOR)
}
});
对于 graphql,您可以动态创建包含枚举的字符串
enum EyeColor {
BROWN
BLUE
GREEN
}
来自您位于 EyeColor.const.js
的对象(我没有编写代码,但它应该非常简单 - 为您的 const 中的每个键在枚举中创建另一个条目)。
这样你的常量只有一个定义。
在"best practice"方面,确实要看你以后的数据库使用情况: 它是否直接与您的 GraphQL 服务器耦合(并且只能通过该 GraphQL API 访问)?然后也许不需要复制该枚举检查。
但是,如果不通过 GraphQL 就可以访问 Mongo(例如,通过未来的模块或服务访问您的 mongoose 函数),那么您将需要保护数据猫鼬级别的模型。