this package is intended to make a glue for express-graphql
and sails
framework.
to install is just straight forward:
- with npm:
npm i sails-graphql-glue
- with yarn:
yarn add sails-graphql-glue
ON api/controllers/graphql.js:
/* api/controllers/graphql.js */
var Promise = require('bluebird');
const { actionAsResolver, serve } = require('sails-graphql-glue');
const typeDefs = `
type Query {
hello: String!
helloName(name: String): String!
}
schema {
query: Query
}
`
const resolvers = {
Query: {
hello: async () => Promise.resolve('hello world!'),
helloName: actionAsResolver(require('./api/hello')),
}
}
module.exports = serve({typeDefs, resolvers, debug: sails.config.environment === 'development'});
ON config/routes.js add the graphql route:
module.exports.routes = {
...
'/graphql': { action: 'graphql' }
};
This function is to wrap sails action2 into a resolver. so you can use your current action freely.
Example: actionAsResolver(require('./api/hello'))
this function is to glue express-graphql into sails compatible.
- typeDefs
graphql schema
- resolvers
root resolvers
- debug
just to make sure json pretty print, GraphiQL, and full error reporting
A Resolver in graphql have this common format:
(parent, args, context, info) => ...
Therefore, to make it compatible with machine inputs,
the parameters changed into $parent
, $context
, $info
.
Parameters from arg
extracted into normal machine inputs
.
// automatically added into action/machine inputs
{
"$parent": {
description: "parent",
type: 'ref',
defaultsTo: {},
},
"$context": {
description: "context",
type: 'ref',
defaultsTo: {},
},
"$info": {
description: "info",
type: 'ref',
defaultsTo: {},
},
}
you can use context (req), as example:
fn: async ({ $context, name = "test" }) => {
console.log(Object.keys($context));
return name
}
// console:
// [
// ...
// 'headers',
// ...
// 'url',
// ...
// 'query',
// ...
// 'cookies',
// ...
// 'session',
// 'file',
// 'body',
// '_body',
// ...
// ]
module.exports = {
friendlyName: 'Me',
description: 'Get Login Information.',
inputs: {},
exits: {},
fn: async function() {
console.log(this.req.headers)
return ({})
}
};
In those example above, the this.req
will be assigned of $context
or request object
. but in arrow function, it will not. since You cannot "rebind" an arrow function. It will always be called with the context in which it was defined. Just use a normal function.
MIT