我希望从Relay存储中保留一些数据部分,并在以后的会话中再次加载它以获得更好的用户体验.(我正在使用Relay with react native for context).
数据可以相对较大(最多几千条记录),并且不需要与服务器同步100%.我希望跨会话保留记录,因为我不希望每次用户打开应用程序时都重新获取数据.这将是服务器的负担和糟糕的用户体验(加载时间).
我可以使用CURL和GraphiQL工具成功完成graphql/relay查询和突变:
但是,在我的react/relay应用程序中,我可以查询并将数据导入应用程序,但每次我尝试在应用程序中改变某些内容时,我都会在控制台中收到此错误:
bundle.js:51511 Uncaught Error: GraphQL validation error ``Cannot query field "store" on type "CreateLinkPayload".`` in file
`/Users/johndoe/react-relay-project/src/mutations/CreateLinkMutation.js`. Try updating your GraphQL schema if an argument/field/type was recently added.
(anonymous function) @ bundle.js:51511
getFatQuery @ bundle.js:51512
getFatQuery @ bundle.js:35664
getQuery @ bundle.js:35791
_handleCommit @ bundle.js:35539
commit @ bundle.js:35453
commit @ bundle.js:35894
(anonymous function) @ bundle.js:28526
Run Code Online (Sandbox Code Playgroud)
每次我这样做npm start都会收到此错误:
-- GraphQL Validation Error -- CreateLinkMutation --
File: /Users/johndoe/react-relay-project/src/mutations/CreateLinkMutation.js
Error: Cannot query field "store" on type "CreateLinkPayload".
Source:
>
> store …Run Code Online (Sandbox Code Playgroud) 我希望明确指出我希望我的依赖项之一需要从 package.json 中的源代码编译到 npm。我在谷歌中搜索,但没有找到任何方法来做到这一点。这可能吗?
我正在尝试使用与Relay兼容的GraphQL架构设置node.js服务器.
尝试验证或加载架构时,我收到以下错误:
EventEdge.node field type must be Output Type but got: undefined.
这是由于在其他类型定义之一中为Event类型提供了连接类型.
我不会发布整个架构,因为它非常详细,但是当连接字段被注释掉时,架构被正确加载并且不会抛出任何错误.
我已经包含了导致相同问题的简化模式的示例:
const graphql = require('graphql')
const relay = require('graphql-relay')
const GraphQLID = graphql.GraphQLID,
GraphQLInt = graphql.GraphQLInt,
GraphQLString = graphql.GraphQLString,
GraphQLList = graphql.GraphQLList,
GraphQLObjectType = graphql.GraphQLObjectType,
GraphQLSchema = graphql.GraphQLSchema,
GraphQLNonNull = graphql.GraphQLNonNull
const connectionArgs = relay.connectionArgs,
connectionDefinitions = relay.connectionDefinitions,
connectionFromArray = relay.connectionFromArray,
cursorForObjectInConnection = relay.cursorForObjectInConnection,
fromGlobalId = relay.fromGlobalId,
globalIdField = relay.globalIdField,
mutationWithClientMutationId = relay.mutationWithClientMutationId,
nodeDefinitions = relay.nodeDefinitions,
toGlobalId = relay.toGlobalId
// Models (ORM Mappings)
const models = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将属性传递到另一个组件。将数组作为<VideoList videos={this.props.channel.video_list}></VideoList>结果传递会this.props.videos成为一个空对象:
{
"videos": {
"__dataID__": "client:5610611954",
"__fragments__": {
"2::client": "client:5610611954"
}
}
}
Run Code Online (Sandbox Code Playgroud)
(GraphQL根据React Chrome扩展程序的确认返回了正确的数据,只是没有传递给VideoList。)
组件/video_list.js
import React from 'react'
import Relay from 'react-relay'
import VideoItem from '../containers/video_item'
export default class VideoList extends React.Component {
render() {
return(
<div>
{
this.props.videos.edges.map(video =>
<VideoItem key={video.id} video={video.node}/>
)
}
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
组件/channel_list.js
import React from 'react'
import Relay from 'react-relay'
import VideoList from './video_list'
export default class ChannelView extends React.Component {
render() { …Run Code Online (Sandbox Code Playgroud) 假设我有一些数据是通过非graphql端点获得的,例如来自第三方服务器(firebase).
如何将数据放入本地中继存储区?是否有一种简单的方法可以直接向中继存储添加/编辑/覆盖数据,而无需通过查询或变异?
我开始使用Relay和我开始构建项目[我对我的项目结构感到困惑(我确实使用了同构方法).
这是我正常的React项目结构:
-- project
|-----src
| |---components (React components with their respective .css styles)
| |---containers (React/Redux containers)
| |---helpers (Helpers, common to components and containers)
| |---redux (Redux stores)
| server.js (node server code)
| client.js (client code)
| routes.js (routes)
| config.js (application config)
|
|-----static
| |-- ... (static files)
|-----webpack
| |-- ... (webpack configuration files)
Run Code Online (Sandbox Code Playgroud)
在React/Redux中,容器在概念上是一个"智能组件"(请参阅此链接,以便在组件(纯React组件)和容器(带有redux数据的"智能组件")中区分它们.
现在,当我转向Relay时,容器在概念上仅与数据相关,与React组件有关(参见此处),这将改变上面的目录结构.
问题:
a)我应该将组件和容器保存为单独的目录吗?
b)我应该将它们称为所有组件并将其构造为:
src
|------ containers
|-------- itemcontainer.js (relay container)
|-------- itemcomponent.js …Run Code Online (Sandbox Code Playgroud) 我正在创建一个用户可以加入和创建组的系统.在这些组中,成员可以创建主题并回复已创建的主题,因此我想知道您对以下哪种方法最佳的看法:创建两个表,groups_posts和group_topics:
--group_topics
id PK
group_id int FK
user_id int FK
title varchar(50)
content varchar(500)
status int
--group_posts
id PK
topic_id int FK
user_id int FK
content varchar(500)
status int
Run Code Online (Sandbox Code Playgroud)
或创建一个唯一的表,group_tposts:
--group_tposts
id PK
group_id int FK
user_id int FK
is_topic boolean
title varchar(50)
content varchar(500)
status int
Run Code Online (Sandbox Code Playgroud) 例如,我有连接类型:
let usersType = new GraphQLObjectType({
name: 'Users',
description: 'users array',
fields: () => ({
array: {
type: userConnection,
description: 'all users',
args: connectionArgs,
searchFor: {
type: GraphQLString
},
resolve: (root, args) => {
return connectionFromArray(get(), args);
}
}
})
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在查询中我只能指定(first,last,after,before)参数,但如果我需要传递一些额外的参数,如userName等,那该怎么办呢?
基本上我需要这样的东西:
query {
array (first: 1, userName: "name")
}
Run Code Online (Sandbox Code Playgroud)
在用户类型我可以处理如下请求:
resolve: (root, args) => connectionFromArray(get(args.userName), args.args)
Run Code Online (Sandbox Code Playgroud) relayjs ×8
graphql ×4
javascript ×4
reactjs ×3
graphql-js ×2
node.js ×2
db-schema ×1
mysql ×1
npm ×1
schema ×1