Node.js GraphQL自定义标量验证

Node.js GraphQL自定义标量验证,node.js,graphql,graphql-js,Node.js,Graphql,Graphql Js,我刚刚为Node.创建了一个简单的标量类型/包 在我看来,它似乎正在按预期工作 但我有个问题要问 与使用输入类型相比,使用此选项似乎可以绕过类型检查 这让我觉得我可能做错了什么 当您在解析时收到错误时,如果该值无效。 GraphiQL中没有警告 我不确定这是否是GraphQL中自定义标量类型的限制。 或GraphiQL实现细节 第一印象是,如果一个JSON5(或JSON)值实际上是从字符串类型派生出来的,但我从未告诉过“GraphQL”,而且似乎不是这样做的方式…… 工具如何知道参数类型错误

我刚刚为Node.创建了一个简单的标量类型/包

在我看来,它似乎正在按预期工作

但我有个问题要问

与使用输入类型相比,使用此选项似乎可以绕过类型检查

这让我觉得我可能做错了什么

当您在解析时收到错误时,如果该值无效。
GraphiQL中没有警告

我不确定这是否是GraphQL中自定义标量类型的限制。 或GraphiQL实现细节

第一印象是,如果一个JSON5(或JSON)值实际上是从字符串类型派生出来的,但我从未告诉过“GraphQL”,而且似乎不是这样做的方式……
工具如何知道参数类型错误

从中获取另一个自定义标量EmailAddress

使用以下查询定义

echoMail(email: EmailAddress): EmailAddress
同样,类型检查仅在运行时/解析程序时发生,因为需要解析程序对其进行解析以进行验证

有更好的方法吗

作为示例,给出了以下实现

类MyScalar{
构造函数(值){
这个值=值;
}
toString(){
返回此.value;
}
静态起始(值){
如果(值的类型!=“字符串”)
抛出新错误(`Expected'String',但得到了'${typeof value}'`);
返回新的MyScalar(值);
}
}
新GraphQLScalarType({
名称:“MyScalar”,
序列化:(x)=>x.toString(),
parseValue:MyScalar.from,
parseLiteral:(ast,变量)=>
种类变量
?(变量和MyScalar.from(变量[ast.name.value])| |未定义
:MyScalar.from(初始值),
});
您将如何改进它?
在何处验证该值是否有任何区别?
上序列化
,在
上解析值
,在
上解析文字
? 还有什么需要“实施”的吗


谢谢

自定义类型/标量。。。显然,您需要自定义验证

在后端/API上:
parseValue
parseLiteral
都是通过
MyScalar.from
进行分组的

已经“接受”(输入时已验证)的值通常不需要“输出时”进行额外的验证(
serialize
)。可能您有时可以使用它来“更正”数据/格式/值,但您可能会在解析器级别执行此操作(在返回应匹配类型[-s]的数据之前读取DB)

在graphiQL/游乐场上: AFAIK无法通知系统如何验证您的自定义类型/标量-根本不受支持

在前端: 在发送自定义数据(变量)之前,您必须(应该)实现相同的验证(相当于在API/后端上使用的验证)规则。

GraphiQL之类的工具可用于获取有关请求所针对的架构的信息。在后台,内省结果被转换为模式的本地副本,这是用来验证编辑器中编写的查询并提供自动完成建议的。换句话说,当您输入一个拼写错误并且GraphiQL以红色突出显示它时,它通过在本地验证查询而不是将请求发送到服务器来实现

这里的关键是GraphiQL模式不是可执行的——它不包含用于编写模式的任何自定义代码。它具有与远程模式相同的类型,但它不包含这些类型使用的任何自定义代码(如解析器),因为这些信息无法通过内省进行通信。因此,当查询由本地模式验证时,它无法知道自定义标量值是否有效,因为它无法运行代码来验证它们。这与
Int
String
等内置标量形成对比,模式可以验证这些标量,因为它有代码来验证它们,因为它们是内置的:)


这是您不想使用自定义标量的几个原因之一,除非绝对必要--它们无法通过客户端、编辑器插件等进行验证。

>因为它们是内置的:)您的答案很有用,尝试对其进行升级,但出于某种原因,仍然保持在0,thanks@Dan可能有人同时否决了它(+8已计);)