Package Exports
- @ttoss/graphql-api-server
- @ttoss/graphql-api-server/dist/esm/index.js
- @ttoss/graphql-api-server/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@ttoss/graphql-api-server) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
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 graphqlGetting 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'],
},
});