标签: graphql-js

GraphQL流类型?

我现在正在玩GraphQL-JS,将其连接到MariaDB后端。

我想出了如何返回整个结果集:

const queryType = new GraphQLObjectType({
    name: 'Query',
    fields: () => ({
        users: {
            type: new GraphQLList(userType),
            resolve: (root, args) => new Promise((resolve, reject) => {
                db.query('select * from users', (err, rows, fields) => {
                    if(err) return reject(err);
                    resolve(rows);
                });
            }),
        }
    })
});
Run Code Online (Sandbox Code Playgroud)

这很酷,但是我正在使用也允许我逐行流式传输结果

GraphQL是否有任何便利措施?

据我所知,GraphQLList期望有一个完整的数组,而且我只能解析一次结果集,不能使用Emitter或其他东西进行输入。

javascript streaming graphql graphql-js

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

Edge.node字段类型必须是输出类型,但得到:undefined

我正在尝试使用与Relay兼容的GraphQL架构设置node.js服务器.

尝试验证或加载架构时,我收到以下错误:

EventEdge.node field type must be Output Type but got: undefined.

这是由于在其他类型定义之一中为Event类型提供了连接类型.

我不会发布整个架构,因为它非常详细,但是当连接字段被注释掉时,架构被正确加载并且不会抛出任何错误.

我已经包含了导致相同问题的简化模式的示例:

  const graphql       = require('graphql')
  const relay         = require('graphql-relay')

  const GraphQLID         = graphql.GraphQLID,
        GraphQLInt        = graphql.GraphQLInt,
        GraphQLString     = graphql.GraphQLString,
        GraphQLList       = graphql.GraphQLList,
        GraphQLObjectType = graphql.GraphQLObjectType,
        GraphQLSchema     = graphql.GraphQLSchema,
        GraphQLNonNull    = graphql.GraphQLNonNull

  const connectionArgs               = relay.connectionArgs,
        connectionDefinitions        = relay.connectionDefinitions,
        connectionFromArray          = relay.connectionFromArray,
        cursorForObjectInConnection  = relay.cursorForObjectInConnection,
        fromGlobalId                 = relay.fromGlobalId,
        globalIdField                = relay.globalIdField,
        mutationWithClientMutationId = relay.mutationWithClientMutationId,
        nodeDefinitions              = relay.nodeDefinitions,
        toGlobalId                   = relay.toGlobalId

  // Models (ORM Mappings)
  const models = …
Run Code Online (Sandbox Code Playgroud)

node.js graphql graphql-js relayjs

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

尝试运行查询时,联合类型的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查询仅不是空对象

我试图执行这样的查询:

{
 people{
   pet{
     name
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

结果:

{
 "people": {
   "pet": null
 }
},
{
 "people": {
   "pet": {
     name: "steve"
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是只让包含宠物的人,有什么办法可以做到这一点,而不是在我的解析器上编码?

express meteor graphql graphql-js

5
推荐指数
2
解决办法
3777
查看次数

GraphQL错误“字段必须是具有字段名称作为键的对象或返回此类对象的函数。”

为什么我从架构文件中收到此错误?

错误:

graphql/jsutils/invariant.js:19
throw new Error(message);
^

Error: Entity fields must be an object with field names as keys or a     function which returns such an object.
Run Code Online (Sandbox Code Playgroud)

错误围绕着entity支柱PersonType。msg指示上的每个字段Entity都应该是一个对象,但是我在任何地方都没有看到这样的示例。

基本上,我试图基于Person查询返回的值从DuckDuckGo API中获取一些数据。从API返回的数据是一个具有许多属性的对象,我试图使用其中的两个来entity在我的对象上填充一个Person对象。

我看过类型系统文档,但看不到答案。http://graphql.org/docs/api-reference-type-system/

这是在Node上运行并提供给GraphiQL UI的代码。

任何建议,将不胜感激!谢谢。

码:

const PersonType = new GraphQLObjectType({
name: 'Person',
description: '...',

fields: () => ({
    name: {
        type: GraphQLString,
        resolve: (person) => person.name
    },
    url: {
        type: GraphQLString,
        resolve: (person) => person.url
    },
    films: {
        type: …
Run Code Online (Sandbox Code Playgroud)

javascript node.js graphql graphql-js

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

处理GraphQL中的Mongoose填充字段

如何表示可以是简单ObjectId字符串或填充对象实体的字段?

我有一个表示'设备类型'的Mongoose Schema,如下所示

// assetSchema.js

import * as mongoose from 'mongoose'
const Schema = mongoose.Schema;

var Asset = new Schema({  name : String,
                          linked_device: { type: Schema.Types.ObjectId, 
                                           ref: 'Asset'})

export AssetSchema = mongoose.model('Asset', Asset);
Run Code Online (Sandbox Code Playgroud)

我试图将其建模为GraphQLObjectType,但我很难理解如何允许linked_ue字段采用两种类型的值,一种是一种ObjectId,另一种是完整的Asset对象(当它被填充时)

// graphql-asset-type.js

import { GraphQLObjectType, GraphQLString } from 'graphql'

export var GQAssetType = new GraphQLObjectType({
           name: 'Asset',
           fields: () => ({
               name: GraphQLString,
               linked_device: ____________    // stumped by this
});
Run Code Online (Sandbox Code Playgroud)

我已经研究了联盟类型,但问题是联盟类型期望字段被规定为其定义的一部分,而在上述情况下,linked_devicelinked_device对应于简单时,字段下面没有字段ObjectId. …

mongoose mongodb node.js graphql graphql-js

5
推荐指数
2
解决办法
2578
查看次数

如何在GraphQL解析器中访问请求对象(使用Apollo-Server-Express)

我有一个使用GraphQL的标准快递服务器

const server = express();

server.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));
Run Code Online (Sandbox Code Playgroud)

问题是:如何访问request解析器内的对象?我想在一些特定的查询中检查JWT

这是导入的架构:

const typeDefs = `
    type User {
        id: String,
        name: String,
        role: Int
    }
    type Query {
        user(id: String): User,
        users: [User]
    }
`;

const resolvers = {
    Query: {
        user: (_, args, context, info) => users.find(u => u.id === args.id),
        users: (_, args, context, info) => users
    }
}

module.exports = makeExecutableSchema({typeDefs, resolvers});
Run Code Online (Sandbox Code Playgroud)

javascript express passport.js graphql graphql-js

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

GraphQL:满足来自JSON文件源的查询

我才刚刚开始使用GraphQL,我想要一个使用磁盘上的JSON文件作为数据源的解析器。到目前为止,我所得到的使GraphQL返回null

我该怎么做?为什么下面的方法不起作用?

var schema = buildSchema(`
type Experiment {
    id: String
    trainData: String
    goldData: String
    gitCommit: String
    employee: String
    datetime: String
}

type Query {
    # Metadata for an individual experiment
    experiment: Experiment
}

schema {
    query: Query
}`);

var root = {
    experiment: () => {
        fs.readFile('./data/experimentExample.json', 'utf8', function(err, data) {  
            if (err) throw err;
            console.log(data);
            return JSON.parse(data);
        });
    }
};  

const app = express();

app.use('/graphql', graphqlHTTP({
  rootValue: root,
  schema: schema,
  graphiql: true
}));

app.listen(4000);
console.log('Running a …
Run Code Online (Sandbox Code Playgroud)

json node.js graphql-js

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

Apollo:从远程模式扩展类型

我目前有多个运行Apollo的GraphQL服务,并创建了一个使用远程模式拼接的"网关"服务,以便为我提供一个访问端点.

在我的网关服务中,我希望扩展远程类型以在拼接模式之间创建引用.

const linkTypeDefs = `
    extend type User {
        profile: Profile
    }

    extend type Profile {
        user: User
    }`;

const schema = mergeSchemas({
    schemas: [userSchema, profileSchema, linkTypeDefs],
    resolvers: /* Resolvers */
});
Run Code Online (Sandbox Code Playgroud)

但是我似乎得到以下错误:

GraphQLError:无法扩展"User"类型,因为它在现有模式中不存在.

我已经进行了双重检查,并且存在"用户"和"配置文件"类型,我可以从Gateway Graphiql查询它们.

为了扩展从远程模式合并的类型,是否需要采取任何特定步骤?

apollo graphql graphql-js react-apollo apollo-client

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

为什么GraphQL查询返回null?

我有一个graphql/ apollo-server/ graphql-yoga端点。该端点公开从数据库(或REST端点或其他服务)返回的数据。

我知道我的数据源正在返回正确的数据-如果将调用结果记录到解析器中的数据源,则可以看到正在返回的数据。但是,我的GraphQL字段始终解析为null。

如果我将字段设为非空,则errors在响应中的数组内部会看到以下错误:

无法为不可为空的字段返回null

为什么GraphQL不返回数据?

graphql graphql-js apollo-server

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