我正在尝试Relay和GraphQL.当我在做模式时,我这样做:
let articleQLO = new GraphQLObjectType({
name: 'Article',
description: 'An article',
fields: () => ({
_id: globalIdField('Article'),
title: {
type: GraphQLString,
description: 'The title of the article',
resolve: (article) => article.getTitle(),
},
author: {
type: userConnection,
description: 'The author of the article',
resolve: (article) => article.getAuthor(),
},
}),
interfaces: [nodeInterface],
})
Run Code Online (Sandbox Code Playgroud)
所以,当我要求这样的文章时:
{
article(id: 1) {
id,
title,
author
}
}
Run Code Online (Sandbox Code Playgroud)
它会对数据库进行3次查询吗?我的意思是,每个字段都有一个解析方法(getTitle,getAuthor ...),它向数据库发出请求.我做错了吗?
这是getAuthor的一个例子(我使用mongoose):
articleSchema.methods.getAuthor = function(id){
let article = this.model('Article').findOne({_id: id})
return article.author
}
Run Code Online (Sandbox Code Playgroud) 我在创建schema.json文件时遇到问题,该文件可以使用babel-relay-plugin进行解析,而不会遇到错误.看一下relay的example文件夹中包含的schema.json文件,我尝试在GraphiQL中复制查询,但我似乎无法正确使用它.我正在使用Laravel作为后端.这是我可以通过GraphiQL完成的事情,还是向GraphQL端点发送请求并保存响应?
尝试解析schema.json文件时发生错误:
Cannot read property 'reduce' of undefined while parsing file: /Users/username/Sites/Homestead/Code/ineedmg-graphql/resources/assets/js/app.js
Run Code Online (Sandbox Code Playgroud)
最后一次尝试使用GraphiQL:
{
__schema {
queryType {
name
},
types {
kind,
name,
description,
fields {
name,
description,
type {
name,
kind,
ofType {
name
description
}
}
isDeprecated,
deprecationReason,
},
inputFields {
name
description
}
interfaces {
kind
name
description
},
enumValues {
name
description
isDeprecated
deprecationReason
}
},
mutationType {
name
},
directives {
name,
description,
onOperation,
onFragment,
onField,
args {
name
description …Run Code Online (Sandbox Code Playgroud) nodeInterface如何重新获取并进行对象识别,
又是什么的type代表又是什么的obj代表,什么是id这里
什么是instanceof意味着什么
const { nodeInterface, nodeField } = nodeDefinitions(
(globalId) => {
const { type, id } = fromGlobalId(globalId);
console.log('NodeDefinitions (globalId), id:', id);
console.log('NodeDefinitions (globalId), type:', type);
if (type === 'teacher') {
return teacher.findOne({ _id: id }).exec();
} else if (type === 'college') {
return college.findOne({ _id: id }).exec();
} else if (type === 'student') {
return student.findOne({ _id: id }).exec();
}
return null;
},
(obj) => {
if( obj instanceof Teacher) { …Run Code Online (Sandbox Code Playgroud) 为什么GraphQL implements关键字需要复制字段,这是强制性的吗?与文档中的示例一样:
enum Episode { NEWHOPE, EMPIRE, JEDI }
interface Character {
id: String
name: String
friends: [Character]
appearsIn: [Episode]
}
type Human implements Character {
id: String
name: String
friends: [Character]
appearsIn: [Episode]
homePlanet: String
}
type Droid implements Character {
id: String
name: String
friends: [Character]
appearsIn: [Episode]
primaryFunction: String
}
Run Code Online (Sandbox Code Playgroud)
如果是,那么潜在的原因是什么?
因为如果我必须复制,如果我改变那么我需要改变到处...
我正在使用graphql-tools。收到GraphQL查询后,我使用ElasticSearch执行搜索并返回数据。
但是,通常所请求的查询仅包括一些可能的字段,而不是全部。我只想将请求的字段传递给ElasticSearch。首先,我需要获取请求的字段。
我已经可以将整个查询作为字符串获取。例如,在解析器中,
const resolvers = {
Query: {
async user(p, args, context) {
//can print query as following
console.log(context.query)
}
.....
}
}
Run Code Online (Sandbox Code Playgroud)
它打印为
query User { user(id:"111") { id name address } }
Run Code Online (Sandbox Code Playgroud)
有没有办法以以下格式获取请求的字段
{ id:"", name:"", address:"" }
Run Code Online (Sandbox Code Playgroud) 我有一个 lambda 函数,它利用 Graphql 和 webscraping 返回一些数据作为响应。有时它不会出现像 502 这样的错误,有时它不会。对我来说,502 错误似乎是完全随机的,因为我一直使用相同的数据发送相同的请求。
我的超时在 AWS 控制台中设置为 5 分钟。
这些是我得到的错误(在浏览器中):
无法加载 [BIG URL] 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源 '[mydomainurl]'。响应具有 HTTP 状态代码 502。
spread.js:25 GET [大网址] 502 ()
但是,当我转到 Chrome 中的“网络”选项卡并在浏览器中查看复制的链接地址时,我会收到带有我想要的数据的 JSON 响应。我在 CloudWatch 中找不到错误。
标题
响应头
content-length: 36
content-type: application/json
date: Fri, 13 Apr 2018 06:17:06 GMT
status: 502
via: 1.1 67284fcf464f6f1529cc1e521669622c.cloudfront.net (CloudFront)
x-amz-apigw-id: FRC2oEiuDoEF_YQ=
x-amz-cf-id: O1VfzIVPySw657r6WV34EvcPMTyeT7eFUBnM3P30NXBmdjTeWHfryw==
x-amzn-requestid: 4766f279-3ee2-11e8-9e72-bdddab0f02d6
x-cache: Error from cloudfront
Run Code Online (Sandbox Code Playgroud)
请求头
:authority: wqbgu8c3ql.execute-api.eu-west-1.amazonaws.com
:method: GET
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda aws-api-gateway graphql-js serverless-framework
我有一个产品和项目
产品:
{
id: Int
style_id: Int
items: [items]
}
Run Code Online (Sandbox Code Playgroud)
项目:
{
id: Int
product_id: Int
size: String
}
Run Code Online (Sandbox Code Playgroud)
我想查询产品,但只取回有尺寸的产品。
因此,查询可能如下所示:
products(size: ["S","M"]) {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎应该有一种方法可以让我做
products {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,添加检查以仅返回具有这些尺寸的产品。通过这种方式,我返回了带有正确分页的顶层,而不是大量空产品。
这是可能的还是至少反过来做:
products(size: ["S","M"]) {
id
style_id
items {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
并将大小参数发送到项目解析器?我知道的唯一方法是通过上下文,但在我发现的一个地方,他们说这不是一个好主意,因为上下文涵盖了所有深度的完整查询。
因此,我使用gatsby-mdx插件从 MDX 文件创建站点。我想在 SitePage 对象和 Mdx 对象之间创建一个关联,以便我可以对 SitePage 边缘执行一个 graphQL 查询以构建站点导航。
我的大部分代码都在 TypeScript 中,所以如果您想知道 WTF 是什么类型的注释,请忽略任何类型注释。
我的第一个想法是使用onCreateNodeAPI,获取 MDX 节点,然后使用createNodeField操作将其添加到 SitePage 。这一切的伟大工程,但盖茨比,MDX插件增加了大量的其他信息,以它们的节点以后使用setFieldsOnGraphQLNodeTypeAPI(发生后的onCreateNodeAPI)。我希望这些字段(例如 frontmatter 和 tableOfContents)在以后的 graphql 查询中可用,但它们没有使用这种方法。
setFieldsOnGraphQLNodeType我想我可以像 gatsby-mdx 扩展 Mdx 节点一样扩展 SitePage 对象。
我在这里遇到的关键问题是我不知道如何创建 Mdx GraphQL 节点类型。
export const setFieldsOnGraphQLNodeType = ({type, actions, getNodes}: any, pluginOptions: any) => {
if (type.name === "SitePage") {
const {createParentChildLink} = actions
return new Promise((resolve) => …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用 GraphQL 在父子关系中实现自下而上的过滤。
考虑以下对停车场和可用停车位进行建模的基本类型层次结构:
type ParkingLot {
id: Int!
spots: [ParkingSpot]
}
type ParkingSpot {
id: Int!,
occupied: Boolean!
}
Run Code Online (Sandbox Code Playgroud)
我想以一种使我能够检索所有至少有一个免费停车位的停车场的方式实现我的解析器。
query AllParkingLotsWithStatus($status : Boolean = false) {
ParkingLot {
id
spots(occupied: $status) {
id
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的 GraphQL 的具体实现是基于 PHP 的,可在此处获得,但任何基于 JS 的实现都非常有助于为我指明正确的方向。我知道有一些库支持使用“where:”参数进行过滤,但我必须自己实现这种机制,因为我使用的库没有提供开箱即用的功能。
我探索的一个想法是在 ParkingLot 的解析器中简单地编写一个 JOIN 语句,但我觉得这不符合 GraphQL 的精神。
我想到的另一个想法是重写查询,使其首先检索 ParkingSlots,并且仅在其状态可用时才获取其父级。然而,这可能是计算密集型的,因为停车位比停车位少,因此导航从父级到子级的关系的计算密集度可能较低。
你会建议什么方法不归结为改变类型层次结构(我没有能力做到这一点)。是否有一种方法可以在子节点的解析器中发生某些条件时立即拒绝父节点,或者这是否会被视为超出 GraphQL 实现的范围,而更像是正在使用的实际库的功能?我想因为有些库支持使用“where:”子句进行过滤,这一定是可能的,而且不应该很复杂。
我想ids从查询变量中获取一个字符串数组作为参数并在我的解析器中使用。下面是我的代码。
import {
Resolver, Query, Mutation, Args,
} from '@nestjs/graphql';
import { People } from './People.entity';
import { PeopleService } from './People.service';
@Resolver(() => People)
export class PeopleResolver {
constructor(private readonly peopleService: PeopleService) { }
@Mutation(() => String)
async deletePeople(@Args('ids') ids: string[]) : Promise<String> {
const result = await this.peopleService.deletePeople(ids);
return JSON.stringify(result);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误,
[Nest] 8247 - 06/22/2020, 6:32:53 PM [RouterExplorer] Mapped {/run-migrations, POST} route +1ms
(node:8247) UnhandledPromiseRejectionWarning: Error: You need to provide explicit type for …Run Code Online (Sandbox Code Playgroud) graphql-js ×10
graphql ×9
relayjs ×3
javascript ×2
reactjs ×2
aws-lambda ×1
gatsby ×1
graphql-php ×1
nestjs ×1
node.js ×1
rest ×1
typescript ×1