你为什么需要以及如何viewer在Relay.js中正确使用?
我花了一周时间尝试了解Relay.js.我现在对GraphQL很好,我理解得很好但是我在同一个应用程序中将GraphQL和Relay.js联合起来有些问题.
第一步可能是理解viewer.我已经看过许多使用它的示例和教程,但它从未被解释过,而且它的确切内容和用途是什么并不十分清楚.
中继文档提到了viewer几次,但是甚至没有一个单词解释它.
我希望我能为这个问题做点什么,但我担心网上没有解释.它只在代码中使用,并且脱离上下文没有任何意义.无论如何,回答这个问题需要一些关于Realy.js/GraphQL的知识.
根据我研究的无数例子,我最好的猜测是它与用户有某种关系?如果用户是匿名或登录?根据登录状态或用户级别授予对数据的不同访问权限?
我有一个使用convo GraphQL,Relay和Flow的项目.有没有办法使用GraphQL模式来提供Flow,这样可以输入React props而无需重新声明类型?
对于Relay,我已经在使用生成两个文件的脚本了:schema.json和schema.graphql.Babel插件用于schema.json将查询转换为javascript.
另一个文件schema.graphql看起来类似于类型的Flow语法定义,但也有差异.我已经尝试了一次,import type {Definition} from "./schema.graphql"但却默默地失败了.
我无法导航到/users我的应用程序中,因为它不会触发我想到它应该获取的所有查询.
我的应用程序包含一个App组件和一些包含实际内容的组件,如Dashboard或UserList.还有一个,EnsureAuthenticationContainer但这只是一个组件,当用户通过身份验证时,只需呈现它的子项.这是我的路线设置:
const ViewerQueries = {
viewer: () => Relay.QL`query { viewer }`
};
Run Code Online (Sandbox Code Playgroud)
[...]
<Router history={browserHistory} render={applyRouterMiddleware(useRelay.default)} environment={Relay.Store}>
<Route path="/" component={App} queries={ViewerQueries}>
<Route path="login" component={Login} />
<Route component={EnsureAuthenticationContainer}>
<IndexRoute component={Dashboard} />
<Route path="users" component={UserList} queries={ViewerQueries} />
<many more routes />
</Route>
</Route>
</Router>
Run Code Online (Sandbox Code Playgroud)
问题是,这两个App和UserList定义fragements,似乎只有的查询UserList被发送.
片段App:
fragments: {
viewer: () => {
return Relay.QL`
fragment on ViewerType {
loggedInUser {
id
} …Run Code Online (Sandbox Code Playgroud) 我想知道如何从一个集团中随机抽取一些成员,但我不知道最好的方法是什么,我认为ORDER BY RAND()不是最好的选择,因为一个集团可以有超过100,000个成员,执行此类型查询可能会很慢.
我发现这种方式使用SQL,但我不知道如何在DQL中做同样的事情:我如何优化MySQL的ORDER BY RAND()函数?
当我使用apache2服务器时,umask在/ etc/apache2/envvars中设置默认值以0002用于解决我的所有权限问题.现在我正在尝试设置nginx/php-fpm,当使用不正确的权限创建文件时,我遇到了同样的问题.
umask在nginx或php-fpm中有设置吗?
这不起作用,因为类型在路径字段定义中引用其自身:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
那怎么办呢?
我一直在和reactjs合作,并且认为我开始玩graphql和relay.我遇到了一个我无法触及的错误,所以我想知道这里是否有人遇到过同样的错误.任何指针或想法都会受到欢迎.
我得到的错误是
Error: GraphQL validation/transform error ``Object has no method 'find'`` in file `/Users/chris/Documents/App/site/js/main.js`.
Run Code Online (Sandbox Code Playgroud)
所以我有一个GraphQL服务器正在运行,一切正常我可以查询后端数据库(我正在使用mongodb),以下查询通过graphql ui生成正确的结果
{
store{
items{
_id
title
sub
}
}
}
produces the following output which is correct
{
"data": {
"store": {
"items": [
{
"_id": "56e2c71d150040c491c73b26",
"title": "Test Item One",
"sub": "sub title here"
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我认为可以安全地假设graphql服务器很好,问题必须是我的relay或babelRelayPlugin.js的实现
以下是main.js文件,其中简化了render方法.
import React from 'react';
import Relay from 'react-relay';
class Main extends React.Component {
render(){
return (
<div>
<p>Test</p>
</div>
);
}
}
Main …Run Code Online (Sandbox Code Playgroud) 我尝试使用React,Relay和GraphQL来实现一些东西,但我遇到了一个我不明白的问题以及我无法找到解决方案的地方.
首先,我创建了一个RootQuery并拥有一个Component,它运行良好.现在我创建了一个带有自己片段的子组件,我得到了这个错误:
relay.js:1799警告:RelayContainer:道具预计
room将提供给RoomList,但得到undefined.null如果这是故意的,请明确传递.
在Networkrequest中,我看到了所有请求的数据.
这是一些代码:
根查询
const RoomQuery = {
room: (Component) => Relay.QL`
query {
room {
${Component.getFragment('room')},
}
}
`
};
Run Code Online (Sandbox Code Playgroud)
路线
<Route name="rooms" path="/rooms" component={Rooms} onEnter={requireAuth} queries={RoomQuery}/>
Run Code Online (Sandbox Code Playgroud)
继电器容器
export default Relay.createContainer(Rooms, {
fragments: {
room: () => Relay.QL`
fragment on Room {
title,
description,
publicKeys,
takenKeys,
image_filename,
subRoomsCount,
owner {
fullName
},
${RoomList.getFragment('room')},
}
`,
}
});
Run Code Online (Sandbox Code Playgroud)
中继子容器
export default Relay.createContainer(RoomList, {
fragments: {
room: () => Relay.QL`
fragment …Run Code Online (Sandbox Code Playgroud) 我收到了这个错误,但我正在定义一个密钥.这是我App.js的抱怨.
import React from 'react';
import Relay from 'react-relay';
import AccountTable from './AccountTable';
class App extends React.Component {
render() {
return (
<div>
<h1>Account list</h1>
{this.props.viewer.accounts.edges.map(edge =>
<AccountTable key={edge.node.id} account={edge.node} />
)}
</div>
);
}
}
export default Relay.createContainer(App, {
fragments: {
viewer: () => Relay.QL`
fragment on User {
accounts(first: 10) {
edges {
node {
${AccountTable.getFragment('account')}
}
}
}
}
`,
},
});
Run Code Online (Sandbox Code Playgroud) relayjs ×8
graphql ×6
reactjs ×6
javascript ×2
php ×2
doctrine-orm ×1
dql ×1
ecmascript-6 ×1
flowtype ×1
nginx ×1
permissions ×1
random ×1
react-router ×1
ubuntu ×1