GraphQL-如何在模式中指定最大字符串长度

GraphQL-如何在模式中指定最大字符串长度,graphql,Graphql,我想告诉GraphQL我的“serialNumber”字段是一个长度在1到20个字符之间的字符串。我知道怎么用这个!在模式中,使字段成为必需的,但是我可以告诉GraphQL还有一个最大字段长度吗 如果我为必需的字符串字段传入空值,GraphQL将不接受它。我希望当它被传递一个长度超过允许的最大长度的字符串时,它的行为是相同的 我研究了两种方法:1)向schema.graphql文件中的字段定义添加“maxlength”属性。或2)创建新类型并为其指定最大长度 我找不到任何关于如何做这件事的信息。

我想告诉GraphQL我的“serialNumber”字段是一个长度在1到20个字符之间的字符串。我知道怎么用这个!在模式中,使字段成为必需的,但是我可以告诉GraphQL还有一个最大字段长度吗

如果我为必需的字符串字段传入空值,GraphQL将不接受它。我希望当它被传递一个长度超过允许的最大长度的字符串时,它的行为是相同的

我研究了两种方法:1)向schema.graphql文件中的字段定义添加“maxlength”属性。或2)创建新类型并为其指定最大长度


我找不到任何关于如何做这件事的信息。是否可能?

您可以使用指令:

directive @length(max: Int!) on FIELD_DEFINITION

input Payload {
  name: String! @length(max: 50)
}

这种类型的规范在graphql(类型)定义中没有位置

您可以使用指令,但并非所有graphql服务器都支持(且未标准化)这些指令-由特定的实现详细信息-检查您的服务器文档


对于单字段,您只需在变异解析器中应用此逻辑即可-如果条件(输入字符串长度介于1和20之间)不满足,只需抛出一个错误。

这可以使用GraphQL自定义类型实现。 可以为所需的每个最大长度定义类型:

StringMaxLenTypes.js:

const logToConsoleToHelpMeUnderstand=false;
const{GraphQLScalarType,Kind}=require('graphql');
const parseStringMaxLenType=(值,maxLength)=>{
logToConsoleToHelpMeUnderstand&&console.log('传递给查询的检查变量是字符串和max'+maxLength+'chars',value)
如果(值的类型=='string'){
if(value.length{return parseStringMaxLenType(value,20)};
const parseStringMaxLen25Type=value=>{return parseStringMaxLenType(value,25)};
const parseStringMaxLen50Type=value=>{return parseStringMaxLentype(value,50)};
const parseStringMaxLen255Type=value=>{return parseStringMaxLentype(value,255)};
const parseStringMaxLen500Type=value=>{return parseStringMaxLentype(value,500)};
常量序列化StringMaxLenType=(值,maxLength)=>{
/**当数据要发送到客户端时,会调用序列化方法。这可以返回任何内容
*任何类型,因为它最终将作为JSON,但我们检查从数据库返回的是字符串
*而且不会太久。
*/
logToConsoleToHelpMeUnderstand&&console.log(`Checking value'${value}'在序列化graphQL到客户端的输出之前最多为${maxLength}个字符(OCCP网关就是客户端)`);
如果(值的类型=='string'){
if(value.length{return serializeStringMaxLenType(value,20)};
const serializeStringMaxLen25Type=(值)=>{return serializeStringMaxLenType(值,25)};
const serializeStringMaxLen50Type=(值)=>{return serializeStringMaxLenType(值,50)};
const serializeStringMaxLen255Type=(值)=>{return serializeStringMaxLenType(值,255)};
const serializeStringMaxLen500Type=(值)=>{return serializeStringMaxLenType(值,500)};
常量parseLiteralStringMaxLenType=(ast,maxLength)=>{
logToConsoleToHelpMeUnderstand&&console.log('检查抽象语法树值(这些值来自GraphQL查询中的参数)不超过'+maxLength+'chars long',ast');
//ast代表抽象语法树,它是
if(ast.kind===kind.STRING){
//请注意,parseStringMaxLenType函数会抛出错误,或返回有效值,因此这里不需要抛出错误。
返回parseStringMaxLenType(ast.value,maxLength)
}否则{
抛出新错误()
}
};
const parseLiteralStringMaxLen20Type=(ast)=>{return parseLiteralStringMaxLenType(ast,20)}
const parseLiteralStringMaxLen25Type=(ast)=>{return parseLiteralStringMaxLenType(ast,25)}
const parseLiteralStringMaxLen50Type=(ast)=>{return parseLiteralStringMaxLenType(ast,50)}
const parseLiteralStringMaxLen255Type=(ast)=>{return parseLiteralStringMaxLenType(ast,255)}
const parseLiteralStringMaxLen500Type=(ast)=>{return parseLiteralStringMaxLenType(ast,500)}
const StringMaxLen20Type=新的GraphQLScalArtType({
名称:“StringMaxLen20Type”,
描述:“最多20个字符的字符串”,
serialize:serializeStringMaxLen20Type,
parseValue:parseStringMaxLen20Type,
parseLiteral:parseLiteralStringMaxLen20Type,
});
const StringMaxLen25Type=新的GraphQLScalArtType({
名称:“StringMaxLen25Type”,
描述:“最多25个字符的字符串”,
serialize:serializeStringMaxLen25Type,
parseValue:parseStringMaxLen25Type,
parseLiteral:parseLiteralStringMaxLen25Type,
});
const StringMaxLen50Type=新的GraphQLScalArtType({
名称:“StringMaxLen50Type”,
描述:“最多50个字符的字符串”,
serialize:serializeStringMaxLen50Type,
parseValue:parseStringMaxLen50Type,
parseLiteral:parseLiteralStringMaxLen50Type,
});
const StringMaxLen255Type=新的GraphQLScalArtType({
名称:“StringMaxLen255Type”,
描述:“最多255个字符的字符串”,
serialize:serializeStringMaxLen255Type,
parseValue:parseStringMaxLen255Type,
parseLiteral:parseLiteralStringMaxLen255Type,
});
const StringMaxLen500Type=新的GraphQLScalArtType({
名称:“StringMaxLen500Type”,
描述:“最多500个字符的字符串”,
serialize:serializeStringMaxLen500Type,
parseValue:parseStringMaxLen500Type,
parseLiteral:parseLiteralStringMaxLen500Type,
});
module.exports={StringMaxLen20Type、StringMaxLen25Type、StringMaxLen50Type、StringMaxLen255Type、StringMaxLen500Type};
然后需要在grapql.shema中定义这些类型中的每一种 schema.graphql:

scalar StringMaxLen20Type
scalar StringMaxLen25Type
scalar StringMaxLen50Type
scalar StringMaxLen255Type
scalar StringMaxLen500Type
type YourOtherTypes {
  id: ID!
  canUseAboveTypesLikeThis: StringMaxLen50Type
}
并将它们导入到resolvers.js中,并在传递给graphQL服务器的解析器对象中定义它们: resolvers.js:

...
...
const {StringMaxLen20Type, StringMaxLen25Type, StringMaxLen50Type, StringMaxLen255Type, StringMaxLen500Type } = require('StringMaxLenTypes.js');```
...
module.exports = {
Query: {...},
Mutation: {...},
StringMaxLen20Type,
StringMaxLen25Type,
StringMaxLen50Type,
StringMaxLen255Type,
StringMaxLen500Type
然后,这将应用与GraphQL相同的严格检查,以确保GraphQL的所有数据类型都达到最大长度。

with指令