@ttoss/graphql-api-server
v0.8.3
Published
GraphQL API Server
Downloads
407
Readme
@ttoss/graphql-api-server
This package provides a Koa server to run your @ttoss/graphql-api
API.
Installation
pnpm add @ttoss/graphql-api-server @ttoss/graphql-api graphql
Getting Started
You can use the createServer
method to create your server.
import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
const server = createServer({
schemaComposer,
graphiql: true,
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
Authentication Types
The server supports the following authentication types:
- No authentication
AWS_COGNITO_USER_POOLS
No authentication
You can disable authentication by not setting the authenticationType
option.
AWS_COGNITO_USER_POOLS
You need to set Cognito user pool ID token or access token to the Authorization
header.
import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
const server = createServer({
schemaComposer,
authenticationType: 'AWS_COGNITO_USER_POOLS',
userPoolConfig: {
userPoolId: process.env.USER_POOL_ID,
tokenUse: 'access' // or 'id'. Default is 'access'.
clientId: process.env.CLIENT_ID,
},
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
Middlewares
You can add middlewares compatible with graphql-middleware
to the server using the middlewares
option.
import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
import { allow, deny, shield } from 'graphql-shield';
const NotAuthorizedError = new Error('Not authorized!');
/**
* The error name is the same value `errorType` on GraphQL errors response.
*/
NotAuthorizedError.name = 'NotAuthorizedError';
const permissions = shield(
{
Query: {
'*': deny,
author: allow,
},
Author: {
id: allow,
name: allow,
},
},
{
fallbackRule: deny,
fallbackError: NotAuthorizedError,
}
);
const server = createServer({
schemaComposer,
middlewares: [permissions],
});
Handling Other Routes
If you want to handle other routes than /graphql
, you can use the Router
class from koa
and add it to the server.
Serving a SPA
import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
import mount from 'koa-mount';
import * as path from 'path';
const server = createServer({
schemaComposer,
graphiql: true,
});
const APP_DIR = path.resolve(__dirname, '../../app/dist');
server.use(mount('/', serve(APP_DIR)));
/**
* Serve a SPA—redirect all requests to index.html
* https://dejanvasic.wordpress.com/2020/08/22/serving-react-spa-in-koa/
*/
server.use(async (ctx, next) => {
return await serve(APP_DIR)(Object.assign(ctx, { path: 'index.html' }), next);
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
Serving Another Endpoint
import { Router, createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
const server = createServer({
schemaComposer,
graphiql: true,
});
const router = new Router();
router.get('/health', (ctx: any) => {
ctx.body = 'OK';
});
server.use(router.routes()).use(router.allowedMethods());
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
CORS
You can enable CORS by setting the cors
option. You can check the available options on @koa/cors package.
import { createServer } from '@ttoss/graphql-api-server';
const server = createServer({
schemaComposer,
cors: {
origin: '*',
allowMethods: ['GET', 'POST'],
},
});