在服务器端依赖 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 函数),那么您将需要保护数据猫鼬级别的模型。