为什么Relay Modern QueryRenderer渲染道具未定义?

时间:2017-10-15 14:28:34

标签: javascript graphql relaymodern

这是我第一次尝试使用Relay Modern。 从PostgraphQL GraphQL Server获取特定用户。 它成功获取数据但未传递给渲染函数:

import {createFragmentContainer, QueryRenderer, graphql} from 'react-relay'
import environment from 'environment'

@CSSModules(styles) export default class Profile extends Component {   
  render() {
    var {props: {children}} = this
    return (
      <QueryRenderer
        environment={environment}
        query={graphql`
          query ProfileQuery {
            userById(id: "f0301eaf-55ad-46db-ac90-b52d6138489e") {
              firstName
              userName
            }
          }
        `}
        render={({error, relayProps}) => {
          if (error) {
            return <div>{error.message}</div>
          } else if (relayProps) {
            ...
          }
          return <div>Loading...</div>
        }}
      />
    )   
  }
} 

仅限#34;正在加载......&#34;被渲染。

我猜是因为它成功获取了graphql服务器和环境正常的数据。

我没有使用React 16,该项目也使用了Redux。

请问为什么relayProps没有价值(例如relayProps.user)?

可能有用的另一件事是,环境(文件)位于主应用程序中,QueryRenderer和组件位于导入的npm包中(要在多个应用程序之间共享)。如上所述,查询似乎工作正常,所以我不认为这是一个问题。我也在包上运行继电器编译器,但没有主应用程序,因为那里没有继电器组件。

以防万一需要使用以下方式设置环境:

const {
  Environment,
  Network,
  RecordSource,
  Store,
} = require('relay-runtime')

// Instantiate Store for Cached Data
const store = new Store(new RecordSource())

// Create Network for GraphQL Server
const network = Network.create((operation, variables) => {
  // GraphQL Endpoint
  return fetch(config.gqlapiProtocol + "://" + config.gqlapiHost + config.gqlapiUri + "/a3/graphql" , {
    method: 'POST',
    headers: {
      'Content-Type': "application/json",
      'Accept': 'application/json',
    },
    body: JSON.stringify({
      query: operation.text,
      variables,
    }),
  }).then(response => {
    return response.json()
  })
})

// Instantiate Environment
const environment = new Environment({
  network,
  store,
})

// Export environment
export default environment

1 个答案:

答案 0 :(得分:0)

props不是relayprops

    render={({ error, props }) => {
      if (error) {
        return <div>{error.message}</div>;
      } else if (props) {
        ...
      }
      return <div>Loading...</div>;
    }}

fetch(GRAPHQL_URL, {
  method: 'POST',
  get headers() {
    return {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    };
  },
  body: JSON.stringify({
    query: operation.text, // GraphQL text from input
    variables
  })
})
  .then(response => response.json())
  .then((json) => {
    // https://github.com/facebook/relay/issues/1816
    if (operation.query.operation === 'mutation' && json.errors) {
      return Promise.reject(json);
    }

    return Promise.resolve(json);
  })
);