Mongodb 在服务器端依赖GraphQL枚举验证
我的问题是最好的做法是什么 我正在创建一个后端,使用GraphQL作为API,MongoDB作为数据存储。 我知道graphql会验证查询,尤其是接收到的枚举。我的问题是,依赖GraphQL输入枚举验证是否足够,还是应该在DB级别添加验证 我这样问是因为这似乎是一种不好的做法,而且不必要的代码复制。 您将在两个位置定义可能的枚举类型,一个在GraphQL模式中,另一个在MongoDB模型中 例如: gql模式:Mongodb 在服务器端依赖GraphQL枚举验证,mongodb,mongoose,graphql,graphql-js,Mongodb,Mongoose,Graphql,Graphql Js,我的问题是最好的做法是什么 我正在创建一个后端,使用GraphQL作为API,MongoDB作为数据存储。 我知道graphql会验证查询,尤其是接收到的枚举。我的问题是,依赖GraphQL输入枚举验证是否足够,还是应该在DB级别添加验证 我这样问是因为这似乎是一种不好的做法,而且不必要的代码复制。 您将在两个位置定义可能的枚举类型,一个在GraphQL模式中,另一个在MongoDB模型中 例如: gql模式: enum EyeColor{棕色蓝色绿色} 猫鼬中的模型: newmongoos
enum EyeColor{
棕色
蓝色
绿色
}
猫鼬中的模型:
newmongoose.Schema({
eyeColor:{type:String,enum:[“棕色”、“蓝色”、“绿色”]}
})代码>
我错过什么了吗?在GraphQL或MongoDB中使用/声明枚举有更好的方法吗?或者只依赖GraphQL也可以?我认为更好的方法是在常量文件EyeColor.const.js
中定义枚举:
const EYE_COLOR = {
BROWN: 'BROWN',
BLUE: 'BLUE',
GREEN: 'GREEN'
};
export {
EYE_COLOR
};
然后在mongoose模型文件中:
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的对象(我没有编写代码,但应该非常简单-对于常量中的每个键,在枚举中创建另一个条目)
这样,您的常量只有一个定义。就“最佳实践”而言,它确实取决于未来数据库的使用方式:
它是否直接与GraphQL服务器耦合(并且只能通过GraphQL API访问)?那么可能就不需要重复该枚举检查了
但是,如果不通过GraphQL就可以访问Mongo(例如,通过未来的模块或服务访问您的mongoose功能),那么您还需要在mongoose级别上保护数据模型