带有 React Router Relay 的 GraphQL:预期类型 Int,找到数字路由的 String

Posted

技术标签:

【中文标题】带有 React Router Relay 的 GraphQL:预期类型 Int,找到数字路由的 String【英文标题】:GraphQL with React Router Relay: Expected type Int, found String for numeric route 【发布时间】:2016-11-12 16:49:22 【问题描述】:

我有以下路由器和使用react-router-relay 包的路由

ReactDOM.render(
    <Router
        history=browserHistory
        render=applyRouterMiddleware(useRelay)
        environment=Relay.Store
    >
            <Route
                path="/user/:userId"
                component=User
                queries=StoreQueries
            />   
    </Router>,
    document.getElementById('root')
);

来自 GraphQL 的我的 StoreType 如下所示,用户字段接受表示非空整数的 id 参数:

let StoreType = new GraphQLObjectType(
    name: 'Store',
    fields: () => (
        user: 
            type: UserType,
            args: 
                id: 
                    type: new GraphQLNonNull(GraphQLInt)
                
            ,
            resolve: (root, args) => db.user.findById(args.id)
        ,
    )
)

user/:userId 路由的我的中继容器:

import React from 'react';
import Relay from 'react-relay'


class User extends React.Component 
    render () 
        return <div>
            User goes here!
        </div>;
    


User = Relay.createContainer(User, 
    initialVariables: 
        userId: null,
    ,

    fragments: 
        store: () => Relay.QL`
            fragment on Store 
                user(id: $userId) 
                    name
                
            
        `
    
);

export default User;

当我在浏览器中访问 /user/1 时,react-router-relay 将 :userId 视为来自路由的字符串而不是整数,GraphQL 返回 JSON 编码的错误消息 "Argument \"id\" has invalid value \"1\".\nExpected type \"Int\", found \"1\"."

有没有办法将 URL 中传递的 userId 参数转换为整数?或者是否有支持格式良好的数字字符串和整数的自定义 GraphQL 标量类型?对此的任何意见或方向表示赞赏。

【问题讨论】:

【参考方案1】:

我最近遇到了同样的问题,最终得到了这个解决方案:

<Route
            path="/user/:userId"
            component=User
            queries=StoreQueries
            prepareParams=(userId) => (userId: parseInt(userId, 10))/>
        /> 

【讨论】:

这就是我最终要做的。这仍然是 v4 中的最佳解决方案吗?有点烂……

以上是关于带有 React Router Relay 的 GraphQL:预期类型 Int,找到数字路由的 String的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-router-relay 和 react-rails 进行服务器端渲染

react-router-relay 是不是与 Relay 模式不一致?

react-router-relay 中的嵌套路由

react-router-relay 的子路由查询错误

石墨烯 Django 和 react-router-relay

使用 react-router-relay 访问要在查询中使用的 url 参数