Mongodb 在服务器端依赖GraphQL枚举验证

Mongodb 在服务器端依赖GraphQL枚举验证,mongodb,mongoose,graphql,graphql-js,Mongodb,Mongoose,Graphql,Graphql Js,我的问题是最好的做法是什么 我正在创建一个后端,使用GraphQL作为API,MongoDB作为数据存储。 我知道graphql会验证查询,尤其是接收到的枚举。我的问题是,依赖GraphQL输入枚举验证是否足够,还是应该在DB级别添加验证 我这样问是因为这似乎是一种不好的做法,而且不必要的代码复制。 您将在两个位置定义可能的枚举类型,一个在GraphQL模式中,另一个在MongoDB模型中 例如: gql模式: enum EyeColor{棕色蓝色绿色} 猫鼬中的模型: newmongoos

我的问题是最好的做法是什么

我正在创建一个后端,使用GraphQL作为API,MongoDB作为数据存储。 我知道graphql会验证查询,尤其是接收到的枚举。我的问题是,依赖GraphQL输入枚举验证是否足够,还是应该在DB级别添加验证

我这样问是因为这似乎是一种不好的做法,而且不必要的代码复制。 您将在两个位置定义可能的枚举类型,一个在GraphQL模式中,另一个在MongoDB模型中

例如:

gql模式:
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级别上保护数据模型