GraphQL is a powerful query language for APIs and a runtime for fulfilling those queries with your existing data. Setting up a GraphQL server with Node.js allows developers to define how clients can interact with the serverβs data in a structured and efficient way. In this guide, we will walk through how to set up a basic GraphQL server using Node.js, Express, and the graphql and express-graphql libraries.
mkdir graphql-server
cd graphql-server
npm init -y
Now install the necessary dependencies:
npm install express graphql express-graphql
Create a file called server.js:
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
// Create schema
const schema = buildSchema(\`
type Query {
message: String
}
\`);
// Define resolver
const root = {
message: () => 'Hello from GraphQL Server!'
};
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true
}));
app.listen(4000, () => {
console.log('GraphQL server running at http://localhost:4000/graphql');
});
Run your server:
node server.js
Open your browser and navigate to:
http://localhost:4000/graphql
Try the following query in GraphiQL:
{
message
}
Letβs now add a custom type and query that returns a list of users.
const schema = buildSchema(\`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
}
\`);
const root = {
users: () => {
return [
{ id: '1', name: 'Alice', email: 'alice@example.com' },
{ id: '2', name: 'Bob', email: 'bob@example.com' }
];
}
};
Now restart the server and query:
{
users {
id
name
email
}
}
Mutations allow us to modify server-side data.
const schema = buildSchema(\`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
}
type Mutation {
addUser(name: String!, email: String!): User
}
\`);
let users = [
{ id: '1', name: 'Alice', email: 'alice@example.com' },
{ id: '2', name: 'Bob', email: 'bob@example.com' }
];
const root = {
users: () => users,
addUser: ({ name, email }) => {
const newUser = {
id: String(users.length + 1),
name,
email
};
users.push(newUser);
return newUser;
}
};
mutation {
addUser(name: "Charlie", email: "charlie@example.com") {
id
name
email
}
}
You can throw errors within resolvers like this:
addUser: ({ name, email }) => {
if (!name || !email) {
throw new Error('Name and email are required');
}
// continue logic...
}
For a more feature-rich alternative to GraphiQL, you can use GraphQL Playground via the apollo-server-express package.
npm install apollo-server-expressYou've now built a basic GraphQL server in Node.js using Express. This setup can be expanded into a full-featured API by integrating databases like MongoDB or PostgreSQL, adding authentication, using GraphQL tools like Apollo, and optimizing performance with dataloaders and caching.
A function passed as an argument and executed later.
Runs multiple instances to utilize multi-core systems.
Reusable blocks of code, exported and imported using require() or import.
nextTick() executes before setImmediate() in the event loop.
Starts a server and listens on specified port.
Node Package Manager β installs, manages, and shares JavaScript packages.
A minimal and flexible web application framework for Node.js.
A stream handles reading or writing data continuously.
It processes asynchronous callbacks and non-blocking I/O operations efficiently.
Node.js is a JavaScript runtime built on Chrome's V8 engine for server-side scripting.
An object representing the eventual completion or failure of an asynchronous operation.
require is CommonJS; import is ES6 syntax (requires transpilation or newer versions).
Use module.exports or exports.functionName.
Variables stored outside the code for configuration, accessed using process.env.
MongoDB, often used with Mongoose for schema management.
Describes project details and manages dependencies and scripts.
Synchronous blocks execution; asynchronous runs in background without blocking.
Allows or restricts resources shared between different origins.
Use try-catch, error events, or middleware for error handling.
Provides file system-related operations like read, write, delete.
Using event-driven architecture and non-blocking I/O.
Functions in Express that execute during request-response cycle.
A set of routes or endpoints to interact with server logic or databases.
Yes, it's single-threaded but handles concurrency using the event loop and asynchronous callbacks.
Middleware to parse incoming request bodies, like JSON or form data.
Copyrights © 2024 letsupdateskills All rights reserved