标签: graphql-js

处理突变中的错误

假设我正在尝试将自行车创建为突变

var createBike = (wheelSize) => {
  if (!factoryHasEnoughMetal(wheelSize)) {
    return supplierError('Not enough metal');
  }
  return factoryBuild(wheelSize);
}
Run Code Online (Sandbox Code Playgroud)

当没有足够的钢材用于闪亮的车轮时会发生什么?我们可能需要客户端的错误.如何通过以下突变从我的graphQL服务器获取它们:

// Mutations
mutation: new graphql.GraphQLObjectType({
  name: 'BikeMutation',
  fields: () => ({
    createBike: {
      type: bikeType,
      args: {
        wheelSize: {
          description: 'Wheel size',
          type: new graphql.GraphQLNonNull(graphql.Int)
        },
      },
      resolve: (_, args) => createBike(args.wheelSize)
    }
  })
})
Run Code Online (Sandbox Code Playgroud)

是否像返回服务器/我定义的错误类型一样简单?

graphql graphql-js

5
推荐指数
1
解决办法
4768
查看次数

使用节点查询graphql

我正在尝试查询一个 graphQL 端点,但我无法弄清楚我做错了什么。我应该如何设置要传递的 graphQL 对象。如果我想通过

{
  name {
     age
  }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何包装它以从服务器获得正确的响应?我目前正在使用的完整代码如下

var http = require('http')
var qs = require('querystring')

var options = {
    hostname: 'url',
    method: 'POST',
    path: '/query'
}

var req = http.request(options, function(res){
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
    });
    res.on('end', function() {
        console.log('No more data in response.')
    })
})

var query = qs.stringify({data: {classes:{}}})


req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

req.write(query)
req.end()
Run Code Online (Sandbox Code Playgroud)

node.js graphql graphql-js

5
推荐指数
1
解决办法
2976
查看次数

尝试运行查询时,联合类型的GraphQL类型错误([错误:未知类型...])

我已经设置了一个graphql模式,其中一个字段('items')是一个Union类型的对象列表,即列表项可以是两个对象类型之一(在这种情况下,它们被称为'packageOfferItem'和' tileItem').

var searchResultItemType = new graphql.GraphQLUnionType({
  name: 'SearchResultItems',
  types: [ packageOfferItem, tileItem ],
  resolveType: function (value) {
    if (value.type === 'packageOffer') {
      return packageOfferItem;
    } else if (value.type === 'tile') {
      return tileItem;
    } else {
      return null;
    }
  }
});

var searchResultItemsType = new graphql.GraphQLList(searchResultItemType);
Run Code Online (Sandbox Code Playgroud)

items然后该字段是类型searchResultItemsType.

在我的测试中,我有一个查询,items使用表示法从文件中请求数据 :

{ 
  items {
     ...on packageOfferItem {
       id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中我得到一个错误 [Error: Unknown type "packageOfferItem".] message: 'Unknown type "packageOfferItem".' } ]

这个错误来自哪里?packageOfferItem是graphql NamedType …

graphql graphql-js

5
推荐指数
0
解决办法
664
查看次数

从突变返回结果

我的直接问题是为什么不调用查询解析函数?

我怀疑是变异解析函数(有效)的返回值存在问题。那么,返回值应该是什么样的呢?

更高层次的问题是:GraphQL 中是否有一种标准的方式来注册新用户并处理用户已经存在的情况?

下面的方法是将用户的所有数据都放在会话数据中,只传回前端需要的数据。

/**
 * graphQL.js
 *
 * Created by jrootham on 18/04/16.
 *
 * Copyright © 2016 Jim Rootham
 */

import graphqlHTTP from "express-graphql";
import {
    graphql,
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLString,
    GraphQLNonNull,
    GraphQLBoolean
} from 'graphql';
import {hash} from "bcrypt"
import {connect, User} from "../database/defineDB";

const GraphUser = new GraphQLObjectType({
    name: "GraphUser",
    description: "A user object",
    fields: () => {
        return {
            name: {
                type: GraphQLString,
                resolve: (_, __, session) => {
                    console.log("resolve name", session);
                    let name = …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js

5
推荐指数
1
解决办法
4169
查看次数

是否有任何工具可以动态生成 graphQl 模式字符串?

我将从 CMS 获得 JSON,并使用 JSON 我希望能够以编程方式编写 graphQl 模式。无需直接写入字符串。

是否有任何 JavaScript 工具可以做到这一点?

我指的是 buildSchema 函数的字符串参数:

http://graphql.org/code/

javascript graphql graphql-js

5
推荐指数
1
解决办法
3147
查看次数

将参数传递给 graphQL 查询

我正在努力在 node.js 中设置一个 graphQL 模式。该/graphql终端通常会与传递的参数(S)击中。例如,一个 API 调用可能正在寻找“检查”帐户:

query {
  accounts(type: "checking") {
    id
    type
    country
    currency
  }
}
Run Code Online (Sandbox Code Playgroud)

另一个可能正在寻找“美国”的所有帐户:

query {
  accounts(country: "US") {
    id
    type
    country
    currency
  }
}
Run Code Online (Sandbox Code Playgroud)

...还有一个可能正在寻找以“英镑”计价的“英国”中的“储蓄”账户:

query {
  accounts(type: "savings", country: "UK", currency: "GBP") {
    id
    type
    country
    currency
  }
}
Run Code Online (Sandbox Code Playgroud)

是否选择了正确的方法定义此查询作为可选项的参数typecountrycurrency

graphql graphql-js

5
推荐指数
1
解决办法
6890
查看次数

如何将突变中的 GraphQLEnumType 作为字符串值传递

我有以下 GraphQLEnumType

const PackagingUnitType = new GraphQLEnumType({
  name: 'PackagingUnit',
  description: '',
  values: {
    Carton: { value: 'Carton' },
    Stack: { value: 'Stack' },
  },
});
Run Code Online (Sandbox Code Playgroud)

在突变查询中,如果我将 PackagingUnit 值作为 Carton(不带引号)传递,它会起作用。但是如果我作为字符串 'Carton' 传递,它会抛出以下错误

In field "packagingUnit": Expected type "PackagingUnit", found "Carton"
Run Code Online (Sandbox Code Playgroud)

有没有办法从客户端将枚举作为字符串传递?

编辑:我的前端有一个表单,我从用户那里收集 PackagingUnit 类型以及其他字段。PackagingUnit 类型在前端表示为字符串(不是 graphQL Enum 类型),由于我没有使用 Apollo Client 或 Relay,所以我必须自己构建 graphQL 查询字符串。现在我正在收集表单数据作为 JSON,然后执行 JSON.stringify(),然后删除属性上的双引号以获得最终的 graphQL 兼容查询。

例如。我的表单有两个字段 PackagingUnitType (An GraphQLEnumType) 和 noOfUnits (An GraphQLFloat) 我的 json 结构是

{ 
  packagingUnitType: "Carton",
  noOfUnits: 10
}
Run Code Online (Sandbox Code Playgroud)

使用 JSON.stringify() 将其转换为字符串

'{"packagingUnitType":"Carton","noOfUnits":10}'
Run Code Online (Sandbox Code Playgroud)

然后删除属性上的双引号

{packagingUnitType:"Carton",noOfUnits:10} …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js

5
推荐指数
1
解决办法
4330
查看次数

在graphql中如何获得最后3个元素

在graphql.js 中如何从mysql db 表中获取最后3 个created_at 元素?我使用 sequelize.js

像这样:

query: '{
    elements(last:3){ 
        id
    }
}'
Run Code Online (Sandbox Code Playgroud)

这是我的文件 db.js

const Conn = new Sequelize(/*connection config*/);
Conn.define('elements', {
    id: {
        type: Sequelize.STRING(36),
        primaryKey: true,
        allowNull: false
    }
});
export default Conn;
Run Code Online (Sandbox Code Playgroud)

这是我的文件 schema.js

const Query = new GraphQLObjectType({
    name: 'Query',
    description: 'Root query object',
    fields() {
        return {
            elements: {
                type: new GraphQLList(Element),
                args: {
                    id: {
                        type: GraphQLString
                    }
                },
                resolve (root, args) {
                    return Db.models.elements.findAll({ where: args });
                }
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

express sequelize.js graphql graphql-js

5
推荐指数
1
解决办法
4992
查看次数

Apollo GraphQL客户端:如何将乐观响应与真实响应区分为watchQuery

问题是关于突变,乐观响应和watchQuery的交互.

我有一个突变"myMutation",它有一个"optimisticResponse"和一个实现的"更新"功能.

每次我进行变异查询时,"update"函数被调用两次,第一次使用乐观响应数据,第二次使用实际数据.一切都很好,所有这些都在文档中描述.

在我的"更新"功能中,我通过使用readQuery/writeQuery方法修改"myQuery"缓存数据.

每次我修改"myQuery"缓存数据时,都会调用watchQuery(基于"myQuery")订阅.一切都很好,所有这些都在文档中描述.

但问题是我无法区分我的watchQuery是否收到乐观的响应数据或真实的响应数据.这对我来说至关重要,因为反应必须不同,因为有价值的数据部分只能由服务器提供.当我收到乐观的响应时,我应该显示一个具有特殊风格的GUI元素,我应该禁止与它进行任何交互,直到我收到真实的响应.

不幸的是,我无法解决这个问题.乍看之下,乐观和真实反应之间没有区别.我已经google了很多,并没有找到解决方案.我唯一的想法是在我的GraphQL数据中添加一个特殊字段,该字段将显示是否从服务器收到响应.但它看起来很难看,闻起来很糟糕.我相信,必须有一个简单的正确方法来克服这个问题.

apollo graphql-js apollo-client

5
推荐指数
1
解决办法
776
查看次数

graphql +猫鼬+打字稿,如何减少重复的模型定义

我使用mongoosetypescriptgraphql构建我的应用。

我是全栈开发人员。

问题是我定义字段类型的模型FIVE倍。

服务器端:

models/book.ts

// first time
interface IBook extends mongoose.Document {
  title: string;
  author: string;
} 

// second time
const bookSchema = new mongoose.Schema({
  title: String,
  author: String
})

const Book: mongoose.Model<IBook> = mongoose.model<IBook>('Book', bookSchema)
Run Code Online (Sandbox Code Playgroud)

graphql/typeDefs.ts

const typeDefs = `
  // third time
  type Book {
    title: String!
    author: String!
  }

  // fourth time
  input BookInput {
    title: String!
    author: String!
  }
`
Run Code Online (Sandbox Code Playgroud)

客户端:

interfaces/book.ts

// fifth time
interface …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js

5
推荐指数
1
解决办法
310
查看次数