a glue for express-graphql and sails framework
npm install sails-graphql-glue  !node !npm bundle size
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:
``javascript
/ 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:
`javascript
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.
###### + parameters
- typeDefs graphql schemaroot resolvers
- resolvers just to make sure json pretty print, GraphiQL, and full error reporting
- debug
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.
`javascript`
// 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:
`javascript
fn: async ({ $context, name = "test" }) => {
console.log(Object.keys($context));
return name
}
// console:
// [
// ...
// 'headers',
// ...
// 'url',
// ...
// 'query',
// ...
// 'cookies',
// ...
// 'session',
// 'file',
// 'body',
// '_body',
// ...
// ]
`
`javascript
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