依赖于服务器端的GraphQL枚举验证

时间:2017-03-25 11:44:11

标签: mongodb mongoose graphql graphql-js

我的问题是什么是最佳做法?

我正在创建一个后端,使用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可以吗?

2 个答案:

答案 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,您可以动态创建包含枚举

的String
enum EyeColor {
 BROWN 
 BLUE 
 GREEN 
}

来自EyeColor.const.js的对象(我没有编写代码,但它应该非常简单 - 对于const中的每个键,在枚举中创建另一个条目)。

这样你只有一个你的竞争定义。