我的问题是什么是最佳做法?
我正在创建一个后端,使用GraphQL作为API,MongoDB作为数据存储区。 我知道graphql验证查询,特别是收到的枚举。我的问题是,如果它足以依赖于GraphQL输入枚举验证或我是否还应该在数据库级别添加验证。
我问这个,因为这似乎是一种不好的做法,而且不需要代码重复。 您将在两个位置定义可能的枚举类型,一个在GraphQL架构中,一个在MongoDB模型中。
例如:
gql架构:
enum EyeColor {
BROWN
BLUE
GREEN
}
猫鼬模特:
new mongoose.Schema({
eyeColor: { type: String, enum: ["BROWN", "BLUE", "GREEN"] }
});
我错过了什么吗?有没有更好的方法在GraphQL或MongoDB中使用/声明枚举?或者也许只依靠GraphQL可以吗?
答案 0 :(得分:3)
就“最佳实践”而言,它取决于您将来如何使用数据库: 它是否与您的GraphQL服务器直接耦合(并且只能通过GraphQL API访问)?然后可能没有必要复制枚举检查。
但是,如果完全可能甚至可能在不通过GraphQL的情况下访问Mongo(例如,通过未来的模块或服务访问您的mongoose函数),那么您将需要保护mongoose级别的数据模型好。
答案 1 :(得分:2)
我认为更好的方法是在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,您可以动态创建包含枚举
的Stringenum EyeColor {
BROWN
BLUE
GREEN
}
来自EyeColor.const.js
的对象(我没有编写代码,但它应该非常简单 - 对于const中的每个键,在枚举中创建另一个条目)。
这样你只有一个你的竞争定义。