mgs-graphql-node
v1.1.0
Published
The simple way to generates GraphQL schemas and Sequelize models from your models definition,microservice supported
Downloads
2
Maintainers
Readme
Simple-GraphQL
Simple-GraphQL
generates GraphQL schemas and Sequelize models from your models definition(support FlowType static type check). The generated GraphQL schema is compatible with Relay.
GraphQL is a query language for your API, and a server-side runtime for executing queries by using a type system you define for your data.
Sequelize is a promise-based ORM for Node.js. It supports the dialects
PostgreSQL
,MySQL
,SQLite
andMSSQL
and features solid transaction support, relations, read replication and more.
FlowType is a static type checker for your JavaScript code. It does a lot of work to make you more productive. Making you code faster, smarter, more confidently, and to a bigger scale.
Document
Install
npm install graphql graphql-relay simple-graphql --save
Roadmap
- [ ] Query cache with dataloader
- [ ] Test
- [ ] < place for your ideas >
Demo & Usage
// @flow
const Sequelize = require('sequelize')
const express = require('express')
const graphqlHTTP = require('express-graphql')
const SG from 'simple-graphql'
// 定义Schema
const TodoSchema = SG.schema('Todo').fields({
title: {
$type: String,
required: true
},
description: String,
completed: {
$type: Boolean,
required: true
},
dueAt: Date
}).queries({
dueTodos: {
description: 'Find all due todos',
$type: ['Todo'],
args: {
dueBefore: {
$type: Date,
required: true
}
},
resolve: async function ({ dueBefore}, context, info, {models:{Todo}}) {
return Todo.find({
where: {
completed: false,
dueAt: {
$lt: dueBefore
}
}
})
}
}
}).mutations({
completedTodo: {
description: 'Mark the todo task completed.',
inputFields: {
todoId: {
$type: 'Todo',
required: true
}
},
outputFields: {
changedTodo: 'Todo'
},
mutateAndGetPayload: async function ({todoId}, context, info, {models:{Todo}}) {
const todo = await Todo.findOne({where: {id: todoId}})
if (!todo) {
throw new Error('Todo entity not found.')
}
if (!todo.completed) {
todo.completed = true
await todo.save()
}
return {changedTodo: todo}
}
}
})
// 定义Sequelize 链接
const sequelize = new Sequelize('test1', 'postgres', 'Password', {
host: 'localhost',
dialect: 'sqlite',
pool: {
max: 5,
min: 0,
idle: 10000
},
// SQLite only
storage: ':memory:'
})
// 生成GraphQL的schema
const schema = SG.build({sequelize:sequelize, schemas:[TodoSchema]}).graphQLSchema
// 自动建立数据库表
sequelize.sync({
force: false, // if true, it will drop all existing table and recreate all.
logging: console.log
}).then(() => console.log('Init DB Done'), (err) => console.log('Init DB Fail', err))
// 启动http服务器
const app = express()
app.use('/graphql', graphqlHTTP({
schema: schema,
graphiql: true
}))
app.listen(4000)