Table of contents
- Getting started
- Creating your schema
- Advanced configuration
- Performances
You can also Start with Boilerplates
Introduction
Graphql-Sequelize-Generator (GSG) is a set of tools that will allow you to easily generate a GraphQL API from your sequelize models.
It’s a very good fit for POCs and MVPs, while also scaling pretty well thanks to dataloader-sequelize.
What can I do with GSG?
The tools provided by this library will allow you to:
- Query any model defined in your app through GraphQL.
- Auto-generate create/update/delete mutations.
- Define before/after hooks and all resolvers, including the mutations.
- Easily create custom mutations.
- Get an integrated interface to test your GraphQL API.
- Counts for each model can also be generated.
- Subscriptions auto-generated for mutations.
- Add custom fields/resolvers on auto-generated types.
- Easy integration with dataloader-sequelize
Getting started
Setting up the dependencies and the library
Add the lib and the peer dependencies of GraphQL-Sequelize-Generator:
yarn add graphql-sequelize-generator graphql sequelize graphql-sequelize @apollo/server dataloader-sequelize graphql-relay ws
⚠️ Caution: GSG requires Node v9.11.2 or greater as it is using async/await.
Initializing the project with Sequelize-CLI and adding data to the database
If you need to initialize the project, please follow this Sequelize documentation page : Sequelize-Cli and Migrations
Setting up your server
Create a file where you will set up your server and paste the following code. We used index.js (at the root of our example project):
// index.js
const { expressMiddleware } = require("@apollo/server/express4");
const express = require("express");
const http = require("http");
const cors = require("cors");
const json = require("body-parser");
const { createContext, EXPECTED_OPTIONS_KEY } = require("dataloader-sequelize");
const setupServer = require("./schema");
const models = require("./models"); //Assuming "models" is your import of the Sequelize models folder, initialized by Sequelize-Cli
const createServer = async (options = {}, globalPreCallback = () => null) => {
const app = express();
options = {
spdy: { plain: true },
...options,
};
const httpServer = http.createServer(options, app);
const { server } = setupServer(globalPreCallback, httpServer);
await server.start();
//server.applyMiddleware({ app, path: '/graphql' })
app.use(
"/graphql",
cors(),
json(),
expressMiddleware(server, {
context: async ({ req, connection }) => {
const contextDataloader = createContext(models.sequelize);
// Connection is provided when a webSocket is connected.
if (connection) {
// check connection for metadata
return {
...connection.context,
[EXPECTED_OPTIONS_KEY]: contextDataloader,
};
}
},
})
);
await new Promise((resolve) => {
httpServer.listen(process.env.PORT || 8080, () => {
resolve();
});
console.log(
`🚀 Server ready at http://localhost:${process.env.PORT || 8080}/graphql`
);
});
return httpServer;
};
const closeServer = async (server) => {
await Promise.all([new Promise((resolve) => server.close(() => resolve()))]);
};
createServer();
In the next part, we will see how to create a schema and to insert models.
Teamstarter’s other libraries
- GraphQL-Node-Jobs
- A job scheduler, a runner and an interface to manage jobs. In one lib.
- GraphQL-Web-Hooks
- A webhook implementation for GraphQL