我查看了Relay的所有文档,似乎没有关于如何与ORM建立中继连接的直接解释.所有示例似乎都使用这种connectionFromArray方法,如果您将数据存储在内存中,但是当您将数据存储在数据库中时,您将如何提供连接分页所需的信息?
我想设置一个查询,该查询具有针对同一参数发送的多个枚举.
test_query(enum:FIRST,SECOND){
stuffs
}
Run Code Online (Sandbox Code Playgroud)
看来这在graphql-JS中是不可能的,但我不确定.
在模式中定义查询时,如何引用先前声明的GraphQLEnumType的值,将其用作参数的默认值?
假设我已经定义了以下ObservationPeriodGraphQLEnumType:
observationPeriodEnum = new GraphQLEnumType {
name: "ObservationPeriod"
description: "One of the performance metrics observation periods"
values:
Daily:
value: '1D'
description: "Daily"
[…]
}
Run Code Online (Sandbox Code Playgroud)
并将其用作查询参数的类型period:
queryRootType = new GraphQLObjectType {
name: "QueryRoot"
description: "Query entry points to the DWH."
fields:
performance:
type: performanceType
description: "Given a portfolio EID, an observation period (defaults to YTD)
and as-of date, as well as the source performance engine,
return the matching performance metrics."
args:
period:
type: observationPeriodEnum
defaultValue: observationPeriodEnum.Daily …Run Code Online (Sandbox Code Playgroud) 我正在尝试将请求主体放入上下文中,因为正文的一部分包含需要解码的JWT.但是,当我尝试以下内容时,我的上下文未定义:
app.use('/', graphqlHTTP((req) => ({
schema: Schema,
context: req.body,
pretty: true,
graphiql: false
})));
Run Code Online (Sandbox Code Playgroud)
我退出了req,我没有看到身体.我正在使用一个名为react-reach的库,它会在请求中向主体添加以下内容:
{
query: {...},
queryParams: {...},
options: {
token: '...' // <-- I'm passing the token into options
}
}
Run Code Online (Sandbox Code Playgroud)
我知道正在解释正文,因为正在解释和执行正文中的查询/突变.传递给上下文时似乎无法找到它.
所以我想弄清楚Relay.js.我想到了一个简单的应用程序,它基本上模仿了Relay网站上的例子.虽然我已经设法摆脱了两个控制台(节点和chrome)中的错误,但我的组件没有收到我在Raley.Container中指定的片段.我不知道问题出在哪里,因为我的应用程序看起来非常像Relay的例子.
请注意,map方法on this.props.companies不可用,因为它是一个具有1个属性的对象,即__dataId__.
第一部分
class App extends React.Component {
render() {
return (
<div>
{this.props.companies.map((comapny => <Company company={company} />))}
</div>
);
}
}
export default Relay.createContainer(App, {
fragments: {
companies: () => Relay.QL`
fragment on Companies {
companies { ${Company.getFragment('company')} }
}
`,
},
});
Run Code Online (Sandbox Code Playgroud)
第二部分
class Company extends React.Component {
render() {
return (
<div>
<h1>{this.props.comapany.name}</h1>
</div>
);
}
}
export default Relay.createContainer(Company, {
fragments: {
company: () => Relay.QL`
fragment on Company {
__id,
name
}
`, …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的查询创建树状结构,以摆脱像我这样的查询
peopleList, peopleSingle, peopleEdit, peopleAdd, peopleDelete companyList, companySingle, companyEdit, companyAdd, companyDelete etc.
Run Code Online (Sandbox Code Playgroud)
最后我想发送这样的查询:
query test {
people {
list {
id
name
}
single(id: 123) {
id
name
}
}
company {
list {
id
name
}
single(id: 456) {
id
name
}
}
}
mutation test2 {
people {
create(data: $var) {
id
name
}
}
people {
edit(id: 123, data: $var) {
id
name
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的人员模块上的查询对象的一部分:
people: {
type: //What type this should be?
name: 'Root …Run Code Online (Sandbox Code Playgroud) 我没有看到任何明确的方法来查询外部GraphQL端点(即https://somewebsite.com/graphql)的数据.有没有其他人这样做过,你是怎么做到的?
我认为它需要你构建一个自定义插件,但这对于这样一个简单的需求来说似乎有些过分.我搜索了文档,这个问题并没有得到解决.
我正在使用apollo客户端进行graphql.我在AppApolloModule中设置了我正在AppModule中导入的客户端.我正在一个服务中进行查询,该服务也在AppModule中导入.虽然该服务在AppApolloModule运行之前运行,因此在进行查询时未初始化apollo并且我收到此错误
Error: Client has not been defined yet
Run Code Online (Sandbox Code Playgroud)
AppApolloModule
imports ....
export class AppApolloModule {
constructor(
apollo: Apollo,
httpLink: HttpLink,
private userService: UserService
) {
console.log("apollo module")
apollo.create({
link: httpLink.create({ uri: `${environment.apiBase}/graphql?${this.myService.token}`}),
cache: new InMemoryCache()
})
}
}
Run Code Online (Sandbox Code Playgroud)
应用模块
import { AppApolloModule } from './app.apollo.module';
import { MyService } from './services/my.service';
export class AppModule {
constructor() {
console.log("app module")
}
}
Run Code Online (Sandbox Code Playgroud)
我没有得到两个控制台app模块和apollo模块,因为服务首先运行,它没有找到任何初始化的apollo应用程序,因此打破了代码.
如何以高效和标准的方式在服务或任何服务之前运行apollo?
这是我的要求:
“添加”突变,BookInput输入类型的每个字段(或称为标量)都应具有附加的类型修饰符“!” 验证非空值。这意味着当我添加一本书时,参数必须具有title和author字段,例如{title: "angular", author: "novaline"}
“更新”突变,我想更新本书的一部分字段,不想更新整本书(MongoDB文档,而且,我不想前端将graphql服务器传递给一个完整的大本书突变参数节省带宽)。这意味着book参数可以是{title: "angular"}或{title: "angular", author: "novaline"}。
这是我的类型定义:
const typeDefs = `
input BookInput {
title: String!
author: String!
}
type Book {
id: ID!
title: String!
author: String!
}
type Query {
books: [Book!]!
}
type Mutation{
add(book: BookInput!): Book
update(id: String!, book: BookInput!): Book
}
`;
Run Code Online (Sandbox Code Playgroud)
目前,“添加”突变可以正常工作。但是,如果我通过{title: "angular"}参数,“更新”突变将无法通过非空检查
这是一个无法通过非空检查的突变,BookInput输入类型缺少“作者”字段。
mutation {
update(id: "1", book: {title: "angular"}) {
id
title …Run Code Online (Sandbox Code Playgroud) 我读了很多:
但是,我还无法理解我们的端点(// graphql)是否受到这种类型的攻击的保护,或者是否有必要使用以下解决方案来保护它:https : //github.com/expressjs/csurf。
我不清楚的是在这里:https : //github.com/pillarjs/understanding-csrf他们说:
当您错误地使用CSRF令牌时:...将它们添加到JSON AJAX调用中如上所述,如果您不支持CORS并且您的API严格是JSON,则将CSRF令牌添加到您的AJAX调用中绝对没有意义。
如果我们将端点限制为仅使用Content-Type: application/json,那么我们安全吗?