标签: graphql-js

如何限制查询自省

我有一个由 apollo-server 提供支持的 node.js 项目。我使用自定义@admin指令对查询、突变和对象字段进行权限检查。对于查询和变异,此指令会引发错误,对于字段,它返回 null 而不是实际值。

现在,我想将 graphiql ui 添加到我的项目中,以便其他开发人员可以探索我的 graphql 模式。但是,我希望他们以匿名用户的方式查看模式,即他们不应该知道@admin字段和@admin查询的存在以及所有更改(即使是非管理员更改)。即使那些拥有执行这些操作的凭据(即以管理员身份登录)的人也不应该看到架构的这些部分。

据我了解,graphiql发送特殊内省查询,其中包含__schema__type区域显示模式和它的文档。

是否有可能以某种方式修改我的架构,该架构是使用makeExecutableSchemafrom构建的graphql-tools以实现我的目标?

apollo graphql graphql-js apollo-server graphql-tools

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

如何使用 jest 使用片段测试 GraphQL 查询

问题:我想测试一个位于.graphql文件中的 GraphQL 查询,如下所示:

#import '../../fragments/Widget.graphql'

query WidgetFragment($id: ID) {
    readWidgetFragment(id: $id) {
        ...Widget
    }
}
Run Code Online (Sandbox Code Playgroud)

为了创建一个带有模拟解析器和数据的 GraphQL 模式,我使用 makeExecutableSchemaaddMockFunctionsToSchema来自graphql-tools

要从 jest 测试中运行查询,我的理解是我需要使用graphql-js 中graphql()函数

此函数需要将查询作为string,所以我尝试了两种不同的方法,但都没有奏效:

  • .graphql文件解析为普通文本文件,给出原始字符串(在我的 jest 配置中使用jest-raw-loader)。这给了我:Failed: Errors in query: Unknown fragment "Widget".当我运行查询时。
  • 使用jest-transform-graphql.graphql文件解析为query对象。我相信这应该是正确的方法,因为它应该正确解析任何导入的片段。但是,要执行查询,我需要传递给,这会导致与选项 1 相同的错误消息。query.loc.source.bodygraphql

jestjs graphql graphql-js graphql-tag

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

GraphQL 是否以 Int 作为枚举

我试图在 GraphQL 模式中创建一个具有 Int 值的枚举类型,但失败了。我可能会错过文档中的某些内容。任何人都知道如何在枚举类型中实现 Int 值,如下所示?

enum IntValue {
  1
  2
  3
}
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js graphql-java

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

带有字符串列表变量“$_v0_data”的突变得到无效值 Graphql Node.js

我有这个简单的突变,效果很好

    type Mutation {
    addJob(
        url: String!
        description: String!
        position: String!
        company: String!
        date: DateTime!
        tags: [String!]!
    ): Job
}
Run Code Online (Sandbox Code Playgroud)

突变解析器

    function addJob(parent, args, context, info) {

    console.log('Tags => ', args.tags)
    // const userId = getUserId(context)
    return context.db.mutation.createJob(
        {
            data: {
                position: args.position,
                componay: args.company,
                date: args.date,
                url: args.url,
                description: args.description,
                tags: args.tags
            }
        },
        info
    )
}
Run Code Online (Sandbox Code Playgroud)

但是,一旦我尝试放置一组字符串(标签),如您在上面看到的那样,II 无法使其正常工作,并且出现此错误

Error: Variable "$_v0_data" got invalid value { ... , tags: ["devops", "aws"] }; Field "0" is not defined by type …
Run Code Online (Sandbox Code Playgroud)

node.js express graphql graphql-js prisma

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

不能使用重复的“graphql”模块

我发现graphql-js 库不允许依赖项也使用 graphql。

你会得到以下错误

Duplicate "graphql" modules cannot be used at the same time since different versions may have different capabilities and behavior. The data from one version used in the function from another could produce confusing and spurious results.

从以下代码

const express = require('express');
const graphqlHTTP = require('express-graphql');
const { GraphQLSchema } = require('graphql'); 
// the module graphql-test-mod-obj-type' has 
// graphql as a depenedency
const myType = require('graphql-test-mod-obj-type');

const app = express();

const schema = new GraphQLSchema({ query: …
Run Code Online (Sandbox Code Playgroud)

graphql-js

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

graphql中resolver函数不同实现的解释

我一直在阅读graphQL文档,发现他们以两种方式解释了graphql服务器的实现:一种使用graphql-yoga,它是一个功能齐全的graphql服务器,另一种使用graphql、express-graphql和express . 在这两种情况下,我们在创建服务器实例时传递架构和解析器函数。

但是解析器功能的实现不同。在使用 graphql-yoga 时,解析器函数提供了 4 个参数,其中包含有关父对象的信息、接收的参数、上下文、信息。而在另一种情况下(使用 graphql),解析器函数只获取参数对象。

为什么呢 ?如果我想要信息、上下文对象,我该如何获取?

使用 graphql-yoga 示例: https

使用 graphql 示例: https

// 使用graphql的代码示例

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

var schema = buildSchema(`
type Query {
    rollDice(numDice: Int!, numSides: Int): [Int]
}
type Mutation {
    addDice(numDice: Int): String
}
`);

var root = {
    rollDice({numDice, numSides}) {
        return [1, 2];
    },
    addDice({numDice}) {
        console.log("Adding something");
        return "Added";
    }
};

var app = express();
app.use('/graphql', …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js express-graphql

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

使用@nestjs/graphql 使用@ResolveProperty 和@Resolvers 创建嵌套查询

此处引用 NestJS 存储库中的 type-graphql 示例存储库我想知道如何在查询的深处再创建两层。

目前它已设置为查询食谱,我能够添加另一个@ObjectType 类

@ObjectType()
export class Author {
  @Field(type => Int)
  id: number;

  @Field({ nullable: true })
  firstName?: string;

  @Field({ nullable: true })
  lastName?: string;
}
Run Code Online (Sandbox Code Playgroud)

并在 Recipe Resolver 中创建了一个 @ResolveProperty :


  @ResolveProperty('author', type => Author)
  async getAuthor(@Parent() recipe) {
    console.log('Resolver auth in recipe', recipe);
   // This will be a database call, just mocking data for now.
    return Promise.resolve({ id: 1, firstName: 'john', lastName: 'smith' });
  }
Run Code Online (Sandbox Code Playgroud)

这一切都很好(我还为 Author 创建了一个单独的解析器,但它不是我的基本查询,所以我没有包含它),使用这个 GraphQL 查询 …

javascript typescript graphql graphql-js nestjs

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

GraphQL 模式定义语言中的别名类型

我今天在生产中有以下 graphql 模式定义:

type BasketPrice {
  amount: Int!
  currency: String!
}

type BasketItem {
   id: ID!
   price: BasketPrice!
}

type Basket {
   id: ID!
   items: [BasketItem!]!
   total: BasketPrice!
}

type Query {
   basket(id: String!): Basket!
}
Run Code Online (Sandbox Code Playgroud)

我想重命名BasketPrice为 just Price,但是这样做会对架构造成重大更改,因为客户端可能会在片段中引用它,例如

fragment Price on BasketPrice {
   amount
   currency
}

query Basket {
   basket(id: "123") {
      items {
         price {
            ...Price
         }
      }
      total {
         ...Price
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我曾希望可以为向后兼容起别名,例如

type Price {
  amount: Int!
  currency: String!
}

# Remove …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js apollo-server

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

@nestjs/graphql 中的指令无效

我正在尝试使用doc之后的代码优先方法添加自定义指令。现在,我使用完全相同的上层指令。但是,该指令似乎没有效果,并且代码从未通过我的自定义函数。

app.module.ts

GraphQLModule.forRoot({
  autoSchemaFile: 'src/schema.gql',
  buildSchemaOptions: {
    dateScalarMode: 'timestamp',
    schemaDirectives: {
      upper: UpperCaseDirective, // no effect
    },
  },
  schemaDirectives: {
    upper: UpperCaseDirective, // no effect
  },
  playground: true,
  introspection: true,
  debug: true,
  // Allow guards and middleware to access req and headers
  context: ({ req }) => ({
    req,
    headers: req.headers,
    databaseConnection: req.databaseConnection,
    updatedAt: req.updatedAt,
  }),
}),
Run Code Online (Sandbox Code Playgroud)

这是我的依赖项package.json

{
  "dependencies": {
    "@nestjs/common": "^7.3.2",
    "@nestjs/core": "^7.3.2",
    "@nestjs/graphql": "^7.5.5",
    "@nestjs/jwt": "^7.1.0",
    "@nestjs/passport": "^7.1.0",
    "@nestjs/platform-express": "^7.3.2",
    "@nestjs/typeorm": …
Run Code Online (Sandbox Code Playgroud)

graphql graphql-js nestjs

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

无法读取 tsconfig.base.json!- Apollo Angular 项目设置

ng add apollo-angular
Run Code Online (Sandbox Code Playgroud)

它发出了许多警告:

UPDATE src/app/app.module.ts (541 bytes)
npm WARN notsup Unsupported engine for extract-files@9.0.0: wanted: {"node":"^10.17.0 || ^12.0.0 || >= 13.7.0"} (current: {"node":"10.16.3","npm":"6.12.0"})
npm WARN notsup Not compatible with your version of node/npm: extract-files@9.0.0
npm WARN karma-jasmine-html-reporter@1.5.4 requires a peer of jasmine-core@>=3.5 but none is installed. You must install peer dependencies yourself.
npm WARN @apollo/client@3.1.3 requires a peer of react@^16.8.0 but none is installed. You must install peer dependencies yourself.
npm WARN @apollo/client@3.1.3 requires a peer of subscriptions-transport-ws@^0.9.0 but …
Run Code Online (Sandbox Code Playgroud)

graphql-js apollo-client angular

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