我有一个用 Java 实现的 GraphQL 服务器和一个查询它的 JavaScript 客户端。我不喜欢的是客户端只需要知道架构,而不能从服务器获取它,而是针对它动态构建查询。
现在,我明白 GraphiQL 以某种方式做到了这一点,但我猜这是因为它的后端也是用 JavaScript 编写的,所以客户端和服务器都可以使用它。我的模式是用 Java 定义的,但可能有一种方法可以自动生成客户端可以使用的 JavaScript 表示。
这样的东西已经存在了吗?
示例片段:
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
people(first: $limit orderBy: $orderBy) {
count
edges {
node {
id,
${PersonListItem.getFragment('person')},
},
},
}
}
`,
},
Run Code Online (Sandbox Code Playgroud)
该orderBy参数接受下列枚举值:firstNameASC/ firstNameDESC/ lastNameASC/lastNameDESC。
执行时this.setVariables({orderBy: 'firstName'}),orderBy变量作为字符串传递给 GraphQL 服务器。
如何将这些变量中的任何一个传递给 Relay 的 setVariables 而不将它们作为字符串发送?
我想在Graphql请求中发送双引号(“)和反斜杠(\),并希望将其取回作为响应。
请检查以下示例:
mutation M {
signUp
(
name: "Harsha Vardhan"
username: "Harsha143",
email: "harshavardhan@sample.com",
description: "Cool "boy" \n And good looking."
)
{
_id,
name
username,
email,
description
}
Run Code Online (Sandbox Code Playgroud)
在上面的突变中,我想在描述中发送双引号和反斜杠。请指导我克服这个问题。
提前致谢。
拥有GraphQL突变的查看器是一个好习惯吗?从理论上讲,这对我来说是有意义的,因为如果你没有登录等等,一些突变终点是不可能的.
但是当我在网上看到例子时,我只看到了查询的GraphQL查看器的实现.对于突变,我没有看到任何观众的实现.例如,GitHub API在其所有突变之上没有查看器.
是否可以动态创建GraphQL架构?
我们将数据存储在mongoDB中,并且可能会添加新字段.我们不希望在mongoDB文档中对此新添加的字段进行任何代码更改.
我们有什么方法可以动态生成架构吗?
模式在代码中定义,但对于java(模式为pojo),添加新属性时,必须更新并重新编译代码,然后再次存档和部署jar.有什么方法可以通过数据生成模式而不是预先定义它?
目前我们正在使用java相关项目(graphql-java,graphql-java-annotations)进行GraphQL开发.
我是GraphQl的新手,刚刚创建了我的第一个模式来查看此错误
Error: RootQueryType.resolve field config must be an object
at invariant (/Applications/Node/users/node_modules/graphql/jsutils/invariant.js:19:11)
at /Applications/Node/users/node_modules/graphql/type/definition.js:360:56
at Array.forEach (native)
at defineFieldMap (/Applications/Node/users/node_modules/graphql/type/definition.js:357:14)
at GraphQLObjectType.getFields (/Applications/Node/users/node_modules/graphql/type/definition.js:311:44)
at typeMapReducer (/Applications/Node/users/node_modules/graphql/type/schema.js:209:25)
at Array.reduce (native)
at new GraphQLSchema (/Applications/Node/users/node_modules/graphql/type/schema.js:98:34)
at Object.<anonymous> (/Applications/Node/users/schema/schema.js:39:18)
at Module._compile (module.js:569:30)
Run Code Online (Sandbox Code Playgroud)
这是我的架构
const graphql = require('graphql');
const _ = require('lodash');
const{
GraphQLObjectType,
GraphQLInt,
GraphQLString,
GraphQLSchema
} = graphql;
const users = [
{id:'23', firstName:'Bill', age:20},
{id:'47', firstName:'Samantha', age:21}
];
const UserType = new GraphQLObjectType({
name: 'User',
fields:{
id: {type: GraphQLString},
firstName: {type: …Run Code Online (Sandbox Code Playgroud) 我正在使用 graphQL 通过组合查询在多个 mongoDB 集合和 API 之间执行搜索。所有查询都返回结果类型
{
_id: string;
name: string;
type: string;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将数据展平成单个数组?
组合查询示例:
query searchAll {
books(input: {text: "e"}) {
_id
name
type
}
magazines(input: {text: "e"}) {
_id
name
type
}
}
Run Code Online (Sandbox Code Playgroud)
响应目前看起来像:
{"data": {
"books": [
{
"_id": "5a8ac759c25b7235ffdc6888",
"name": "someBook",
"type": "book"
}
],
"magazines": [
{
"_id": "5a87005bc25b7235ffdc4bdf",
"name": "someMagazine-1",
"type": "magazine"
},
{
"_id": "5a870067c25b7235ffdc4be4",
"name": "someMagazine-2",
"type": "client"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
期望的回应:
{"data": {
"results": [
{
"_id": "5a8ac759c25b7235ffdc6888", …Run Code Online (Sandbox Code Playgroud) 使用graphql enum可以创建预定义的元素列表,但是字符串不起作用。
例如:
enum Dias {
lunes
martes
miércoles
jueves
viernes
sábado
domingo
}
Run Code Online (Sandbox Code Playgroud)
这返回一个错误 GraphQLError: Syntax Error: Cannot parse the unexpected character "\u00E9".
如何创建预定义的字符串列表?
编辑:为了提供更多的上下文,我想反映数据库架构,这是这样的(与猫鼬):
dias: {
type: String,
enum: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo'],
lowercase: true,
required: true
}
Run Code Online (Sandbox Code Playgroud) 我正在制作GraphQL API,在其中我可以通过其ID检索汽车对象或在不提供任何参数的情况下检索所有汽车。
使用下面的代码,我可以通过提供id作为参数来成功检索单个汽车对象。
但是,在我希望得到对象数组的情况下,即当我完全不提供任何参数时,在GraphiQL上没有任何结果。
schema.js
let cars = [
{ name: "Honda", id: "1" },
{ name: "Toyota", id: "2" },
{ name: "BMW", id: "3" }
];
const CarType = new GraphQLObjectType({
name: "Car",
fields: () => ({
id: { type: GraphQLString },
name: { type: GraphQLString }
})
});
const RootQuery = new GraphQLObjectType({
name: "RootQueryType",
fields: {
cars: {
type: CarType,
args: {
id: { type: GraphQLString }
},
resolve(parent, args) {
if (args.id) {
console.log(cars.find(car => …Run Code Online (Sandbox Code Playgroud) 在更新我们的GraphQL API时,仅_id需要model 字段,因此!在下面的SDL语言代码中。其他字段(例如,name不必包含在更新中)也不能具有null值。当前,!从名称字段中排除namein 允许最终用户不必在更新中传递in,但允许最终用户传递in的null值name,这是不允许的。
一个null值使我们知道需要从数据库中删除一个字段。
下面是一个可能导致问题的模型示例- Name自定义标量不允许空值,但GraphQL仍允许它们通过:
type language {
_id: ObjectId
iso: Language_ISO
auto_translate: Boolean
name: Name
updated_at: Date_time
created_at: Date_time
}
input language_create {
iso: Language_ISO!
auto_translate: Boolean
name: Name!
}
input language_update {
_id: ObjectId!
iso: Language_ISO!
auto_translate: Boolean
name: Name
}
Run Code Online (Sandbox Code Playgroud)
当传入null值时,它会绕过我们的Scalars,因此如果null不是允许的值,我们就不会引发用户输入验证错误。
我知道这!意味着non-nullable,并且缺少!手段意味着该字段可为空,但是令人沮丧的是,据我所知,如果某个字段不是必需的/可选的,我们无法为该字段指定确切的值。仅在更新时会发生此问题。
有什么方法可以通过自定义Scalars解决此问题,而不必在每个更新解析器中启动硬编码逻辑,而这似乎很麻烦?
可能失败的示例变异
mutation tests_language_create( $input: language_update! ) { …Run Code Online (Sandbox Code Playgroud) graphql ×10
graphql-js ×10
javascript ×3
node.js ×3
java ×2
graphql-java ×1
reactjs ×1
relay ×1