当前位置: 首页 > 软件库 > 大数据 > 数据查询 >

koa-graphql

Create a GraphQL HTTP server with Koa.
授权协议 View license
开发语言 Java
所属分类 大数据、 数据查询
软件类型 开源软件
地区 不详
投 递 者 厉念
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

GraphQL Koa Middleware

Build Status

Create a GraphQL HTTP server with Koa.

Port from express-graphql.

Installation

npm install --save koa-graphql

Usage

Mount koa-graphql as a route handler:

const Koa = require('koa');
const mount = require('koa-mount');
const graphqlHTTP = require('koa-graphql');

const app = new Koa();

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

app.listen(4000);

With koa-router@7

const Koa = require('koa');
const Router = require('koa-router'); // koa-router@7.x
const graphqlHTTP = require('koa-graphql');

const app = new Koa();
const router = new Router();

router.all(
  '/graphql',
  graphqlHTTP({
    schema: MyGraphQLSchema,
    graphiql: true,
  }),
);

app.use(router.routes()).use(router.allowedMethods());

For Koa 1, use koa-convert to convert the middleware:

const koa = require('koa');
const mount = require('koa-mount'); // koa-mount@1.x
const convert = require('koa-convert');
const graphqlHTTP = require('koa-graphql');

const app = koa();

app.use(
  mount(
    '/graphql',
    convert.back(
      graphqlHTTP({
        schema: MyGraphQLSchema,
        graphiql: true,
      }),
    ),
  ),
);

NOTE: Below is a copy from express-graphql's README. In this time I implemented almost same api, but it may be changed as time goes on.

Options

The graphqlHTTP function accepts the following options:

  • schema: A GraphQLSchema instance from graphql-js.A schema must be provided.

  • graphiql: If true, presents GraphiQL when the GraphQL endpoint isloaded in a browser. We recommend that you set graphiql to true when yourapp is in development, because it's quite useful. You may or may not want itin production.Alternatively, instead of true you can pass in an options object:

    • defaultQuery: An optional GraphQL string to use when no queryis provided and no stored query exists from a previous session.If undefined is provided, GraphiQL will use its own default query.
    • editorTheme: By passing an object you may change the theme of GraphiQL.Details are below in the Custom GraphiQL themes section.
  • rootValue: A value to pass as the rootValue to the graphql()function from graphql-js/src/execute.js.

  • context: A value to pass as the context to the graphql()function from graphql-js/src/execute.js. If context is not provided, thectx object is passed as the context.

  • pretty: If true, any JSON response will be pretty-printed.

  • extensions: An optional function for adding additional metadata to theGraphQL response as a key-value object. The result will be added to the"extensions" field in the resulting JSON. This is often a useful place toadd development time metadata such as the runtime of a query or the amountof resources consumed. This may be an async function. The function isgiven one object as an argument: { document, variables, operationName, result, context }.

  • validationRules: Optional additional validation rules queries mustsatisfy in addition to those defined by the GraphQL spec.

  • customValidateFn: An optional function which will be used to validateinstead of default validate from graphql-js.

  • customExecuteFn: An optional function which will be used to executeinstead of default execute from graphql-js.

  • customFormatErrorFn: An optional function which will be used to format anyerrors produced by fulfilling a GraphQL operation. If no function isprovided, GraphQL's default spec-compliant formatError function will be used.

  • customParseFn: An optional function which will be used to create a documentinstead of the default parse from graphql-js.

  • formatError: is deprecated and replaced by customFormatErrorFn. It will beremoved in version 1.0.0.

  • fieldResolver

  • typeResolver

HTTP Usage

Once installed at a path, koa-graphql will accept requests withthe parameters:

  • query: A string GraphQL document to be executed.

  • variables: The runtime values to use for any GraphQL query variablesas a JSON object.

  • operationName: If the provided query contains multiple namedoperations, this specifies which operation should be executed. If notprovided, a 400 error will be returned if the query contains multiplenamed operations.

  • raw: If the graphiql option is enabled and the raw parameter isprovided raw JSON will always be returned instead of GraphiQL even whenloaded from a browser.

GraphQL will first look for each parameter in the URL's query-string:

/graphql?query=query+getUser($id:ID){user(id:$id){name}}&variables={"id":"4"}

If not found in the query-string, it will look in the POST request body.

If a previous middleware has already parsed the POST body, the request.bodyvalue will be used. Use multer or a similar middleware to add supportfor multipart/form-data content, which may be useful for GraphQL mutationsinvolving uploading files. See an example using multer.

If the POST body has not yet been parsed, koa-graphql will interpret itdepending on the provided Content-Type header.

  • application/json: the POST body will be parsed as a JSONobject of parameters.

  • application/x-www-form-urlencoded: this POST body will beparsed as a url-encoded string of key-value pairs.

  • application/graphql: The POST body will be parsed as GraphQLquery string, which provides the query parameter.

Combining with Other koa Middleware

By default, the koa request is passed as the GraphQL context.Since most koa middleware operates by adding extra data to therequest object, this means you can use most koa middleware just by inserting it before graphqlHTTP is mounted. This covers scenarios such as authenticating the user, handling file uploads, or mounting GraphQL on a dynamic endpoint.

This example uses koa-session to provide GraphQL with the currently logged-in session.

const Koa = require('koa');
const mount = require('koa-mount');
const session = require('koa-session');
const graphqlHTTP = require('koa-graphql');

const app = new Koa();
app.keys = ['some secret hurr'];
app.use(session(app));
app.use(function* (next) {
  this.session.id = 'me';
  yield next;
});

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

Then in your type definitions, you can access the ctx via the third "context" argument in your resolve function:

new GraphQLObjectType({
  name: 'MyType',
  fields: {
    myField: {
      type: GraphQLString,
      resolve(parentValue, args, ctx) {
        // use `ctx.session` here
      },
    },
  },
});

Providing Extensions

The GraphQL response allows for adding additional information in a response toa GraphQL query via a field in the response called "extensions". This is addedby providing an extensions function when using graphqlHTTP. The functionmust return a JSON-serializable Object.

When called, this is provided an argument which you can use to get informationabout the GraphQL request:

{ document, variables, operationName, result, context }

This example illustrates adding the amount of time consumed by running theprovided query, which could perhaps be used by your development tools.

const graphqlHTTP = require('koa-graphql');

const app = new Koa();

app.keys = ['some secret hurr'];
app.use(session(app));

const extensions = ({
  document,
  variables,
  operationName,
  result,
  context,
}) => {
  return {
    runTime: Date.now() - context.startTime,
  };
};

app.use(
  mount(
    '/graphql',
    graphqlHTTP((request) => {
      return {
        schema: MyGraphQLSchema,
        context: { startTime: Date.now() },
        graphiql: true,
        extensions,
      };
    }),
  ),
);

When querying this endpoint, it would include this information in the result,for example:

{
  "data": { ... }
  "extensions": {
    "runTime": 135
  }
}

Additional Validation Rules

GraphQL's validation phase checks the query to ensure that it can be successfully executed against the schema. The validationRules option allows for additional rules to be run during this phase. Rules are applied to each node in an AST representing the query using the Visitor pattern.

A validation rule is a function which returns a visitor for one or more node Types. Below is an example of a validation preventing the specific field name metadata from being queried. For more examples, see the specifiedRules in the graphql-js package.

import { GraphQLError } from 'graphql';

export function DisallowMetadataQueries(context) {
  return {
    Field(node) {
      const fieldName = node.name.value;

      if (fieldName === 'metadata') {
        context.reportError(
          new GraphQLError(
            `Validation: Requesting the field ${fieldName} is not allowed`,
          ),
        );
      }
    },
  };
}

Disabling introspection

Disabling introspection does not reflect best practices and does not necessarily make yourapplication any more secure. Nevertheless, disabling introspection is possible by utilizing theNoSchemaIntrospectionCustomRule provided by the graphql-jspackage.

import { NoSchemaIntrospectionCustomRule } from 'graphql';

app.use(
  '/graphql',
  graphqlHTTP((request) => {
    return {
      schema: MyGraphQLSchema,
      validationRules: [NoSchemaIntrospectionCustomRule],
    };
  }),
);

Custom GraphiQL themes

To use custom GraphiQL theme you should pass to graphiql option an object withthe property editorTheme. It could be a string with the name of a theme from CodeMirror

router.all(
  '/graphql',
  graphqlHTTP({
    schema: MyGraphQLSchema,
    graphiql: {
      editorTheme: 'blackboard',
    },
  }),
);

List of available CodeMirror themas

or an object with url and name properties where url should lead toyour custom theme and name would be passed to the GraphiQLreact element on creation as the editorTheme property

router.all(
  '/graphql',
  graphqlHTTP({
    schema: MyGraphQLSchema,
    graphiql: {
      editorTheme: {
        name: 'blackboard',
        url: 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.53.2/theme/erlang-dark.css',
      },
    },
  }),
);

For details see the GraphiQL spec

Additional Validation Rules

GraphQL's validation phase checks the query to ensure that it can be successfully executed against the schema. The validationRules option allows for additional rules to be run during this phase. Rules are applied to each node in an AST representing the query using the Visitor pattern.

A validation rule is a function which returns a visitor for one or more node Types. Below is an example of a validation preventing the specific fieldname metadata from being queried. For more examples see the specifiedRules in the graphql-js package.

import { GraphQLError } from 'graphql';

export function DisallowMetadataQueries(context) {
  return {
    Field(node) {
      const fieldName = node.name.value;

      if (fieldName === 'metadata') {
        context.reportError(
          new GraphQLError(
            `Validation: Requesting the field ${fieldName} is not allowed`,
          ),
        );
      }
    },
  };
}

Debugging Tips

During development, it's useful to get more information from errors, such asstack traces. Providing a function to customFormatErrorFn enables this:

customFormatErrorFn: (error, ctx) => ({
  message: error.message,
  locations: error.locations,
  stack: error.stack ? error.stack.split('\n') : [],
  path: error.path,
});

Examples

Other relevant projects

Please checkout awesome-graphql.

Contributing

Welcome pull requests!

License

BSD-3-Clause

  • GraphQL 渐进学习 08-graphql-采用eggjs-服务端开发 软件环境 eggjs 2.2.1 请注意当前的环境,老版本的 egg 可能配置有差异 目标 创建 graphql 服务 用户登录授权 用户访问鉴权 代码 ducafecat/eggjs-graphql-example/egg-server 步骤 1 使用 egg-graphql 安装包 npm i --save egg-g

  • 1、egg-graphql的中间件graphql预留的钩子onPreGraphQL函数,没有做拦截,即使鉴权未通过也会去转发请求。 2、思路:扩展graphql中间件,加入鉴权 3、在文件夹middleware建立鉴权文件graphqlJwt.js,实现如下 使用egg-jwt来生成token 'use strict'; // Notice that this path is totally c

  • apollo+koa环境搭建 引入插件 apollo-server--koa 创建apollo server并传入GraphQL表 创建koa对象 将koa对象作为中间件传入apollo server 监听端口 定义GraphQL表并传入query对象和Mutation对象 安装插件 apollo-server-koa 和 koa cnpm install apollo-server-koa ko

  • 简介 GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 优点: 请求你所要的数据不多不少 获取多个资源只用一个请求 描述所有的可能类型系统 强大的开发者工具 API 演

 相关资料
  • Koa

    Koa art-template view render middleware. support all feature of art-template. Install npm install --save art-template npm install --save koa-art-template Example const Koa = require('koa'); const ren

  • koa

    koa是Express的下一代基于Node.js的web框架,目前有1.x和2.0两个版本。 历史 1. Express Express是第一代最流行的web框架,它对Node.js的http进行了封装,用起来如下: var express = require('express'); var app = express(); app.get('/', function (req, res) {

  • Koa

    Koa 是下一代的 Node.js 的 Web 框架。由 Express 团队设计。旨在提供一个更小型、更富有表现力、更可靠的 Web 应用和 API 的开发基础。 Koa可以通过生成器摆脱回调,极大地改进错误处理。Koa核心不绑定任何中间件,但提供了优雅的一组可以快速和愉悦地编写服务器应用的方法。 示例代码: var koa = require('koa');var app = koa();//

  • Koa - HelloWorld 以上便是全部了,我们重点来看示例,我们只注册一个中间件, Hello Worler Server: <?php $app = new Application(); // ... $app->υse(function(Context $ctx) { $ctx->status = 200; $ctx->body = "<h1>Hello Worl

  • koa-log4js A wrapper for log4js-node which support Koa logger middleware.Log message is forked from Express (Connect) logger file. Note This branch is use to Koa v2.x.To use Koa v0.x & v1.x, please ch

  • koa-rudy 环境 node -v >=6.9.0pm2 启动 npm install npm run dev 开发环境 npm run dev || test || prod 接口测试 npm run mocha 推荐开发工具 vscode 实现 支持 async/await MVC架构(middleware-view-controller) RESTful a

  • 学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理 1. 前言 你好,我是若川,微信搜索「若川视野」关注我,专注前端技术分享。欢迎加我微信ruochuan12,加群交流学习。 这是学习源码整体架构系列第七篇。整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现。本篇文章学习的是实际仓库的代码。 本文仓库地址:git clon

  • koa-seo SEO middleware for koa base on chrome-render, a substitute for prerender. Modern web app use technique like react.js vue.js which render html in browser, this lead to search engine can't crawl