【问题标题】:GraphQL large integer error: Int cannot represent non 32-bit signed integer valueGraphQL 大整数错误:Int 不能表示非 32 位有符号整数值
【发布时间】:2017-12-12 10:20:31
【问题描述】:

我正在尝试使用 GraphQL 将 UNIX 时间戳存储在 MongoDB 中,但它发现 GraphQL 在处理整数方面存在限制。请参阅下面的突变:

const addUser = {
    type: UserType,
    description: 'Add an user',
    args: {
        data: {
            name: 'data',
            type: new GraphQLNonNull(CompanyInputType)
        }
    },
    resolve(root, params) {

        params.data.creationTimestamp = Date.now();

        const model = new UserModel(params.data);
        const saved = model.save();

        if (!saved)
            throw new Error('Error adding user');

        return saved;
    }
}

结果:

  "errors": [
    {
      "message": "Int cannot represent non 32-bit signed integer value: 1499484833027",
      "locations": [
        {
          "line": 14,
          "column": 5
        }
      ],
      "path": [
        "addUser",
        "creationTimestamp"
      ]
    }

我目前在类型定义的这个字段中使用GraphQLInteger

creationTimestamp: { 
    type: GraphQLInt
}

如果GraphQL 中没有更大的GraphQLInt,我该如何解决?

【问题讨论】:

    标签: javascript mongodb mongoose graphql


    【解决方案1】:

    GraphQL 不支持大于 32 位的整数,如错误所示。你最好使用像GraphQL Date 这样的自定义标量。还有一个可用的“长”类型here。或者你可以滚动你自己的自定义类型; Apollo 有一个很好的例子here

    如果你好奇为什么 GraphQL 不支持更大的东西,你可以查看this issue on Github

    【讨论】:

    【解决方案2】:

    ⚠️不推荐...

    ...但是如果您想要快速修复(也许您没有时间实现自定义标量),您可以使用 Float 类型而不是 Int

    【讨论】:

    • 嘿,我对你的评论投了反对票,因为它不是很有帮助,你自己甚至“不推荐”它。 Float 和 Int 共享相同的位大小。
    • 我的意思是我知道,但是当我遇到这个错误时,我根本没有时间重构我的所有架构,就像有效答案中提到的那样:/ 这个错误有点意外,因为简单的时间戳不适合(请自行尝试,因为我在this issue 中找到了这个“技巧”)。所以是的,也许这不是最好的答案,但它绝对可以帮助面临同样问题的人,所以没有理由拒绝它。
    • 这表示不推荐,但没有提供您不想这样做的理由。
    • @Gakio 因为最好根据需要使用正确的类型。如果你不需要使用一些浮点数,那就没有意义了。
    猜你喜欢
    • 2023-03-13
    • 2023-03-17
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多