TypeGraphQL

TypeGraphQL

八月 07, 2019

安装

  • 安装主包
    1
    2
    3
    4
    5
    npm i graphql @types/graphql type-graphql
    ```
    * 安装reflect-metadata,用来做类型反射
    ```js
    npm i reflect-metadata

注意: 我们必须确保该包在我们使用/导入 type-graphql或者我们的resolvers之前引用reflect-metadata,如下

1
import "reflect-metadata";

TypeScript配置

  • tsconfig.json配置如下选项

    1
    2
    3
    4
    {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
    }
  • 因为TypeGraphQL基于Node.js LTS (8, 10) ,它使用了ES7(ES2016)的语法,所以还必须设置

    1
    2
    3
    {
    "target": "es2016" // or newer if your node.js version supports this
    }
  • 由于graphql的订阅依赖AsyncIterator,所以我们还必须配置esnext.asynciterable

    1
    2
    3
    {
    "lib": ["es2016", "esnext.asynciterable"]
    }

所有,总结上面的,tsconfig.json需要添加如下选项:

1
2
3
4
5
6
7
8
9
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"lib": ["es2016", "esnext.asynciterable"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}

具体使用方法可以参考: Nest-Graphql的使用
,因为Nest也是基于TypeGraphql开发的,所以基本都差不多。下面介绍些额外的知识。

部署Graphql Server

因为typegraphql没有单独的部署server的方法,所以我们这里会用到apollo-server-koa(node的框架是koa)

1
import { ApolloServer } from 'apollo-server-koa';

然后创建schema,遍历加载所有的resolver

1
2
3
4
5
6
// 创建graphql的schema
const schema = await buildSchema({
resolvers: loadResolvers(path.join(__dirname, 'resolver')),
// automatically create `schema.gql` file with schema definition in project's working directory
emitSchemaFile: true,
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 加载所有resolver
function loadResolvers(dirPath: string): any[] {
// tslint:disable-next-line:prefer-const
let resolverArr: any[] = [];
if (!fs.existsSync(dirPath)) { return resolverArr; }
const list = fs.readdirSync(dirPath);
list.forEach((filename) => {
const file = path.join(dirPath, filename);
const module = require(file);
Object.keys(module).forEach((key) => {
resolverArr.push(module[key]);
});
});
return resolverArr;
}

最后就是创建server,并且应用于koa的中间件了

1
2
3
4
5
6
7
8
9
10
11
12
const server = new ApolloServer({
schema,
tracing: false,
playground: {
settings: {
'request.credentials': 'include',
},
} as any,
introspection: true,
});
const app = new Koa();
server.applyMiddleware({ app });

下来就可以通过 监听端口/graphql 访问啦。