🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Integrazione di un Database NoSQL in un'Applicazione GraphQL con Apollo

Codegrind Team•Sep 03 2024

Integrare un database NoSQL come MongoDB in un’API GraphQL con Apollo Server ti permette di sfruttare la flessibilità e la scalabilità di un database NoSQL, combinata con la potenza e la versatilità di GraphQL. In questa guida, esploreremo come configurare e utilizzare MongoDB in un progetto Node.js con Apollo Server per creare un’API GraphQL robusta e scalabile.

Prerequisiti

Prima di iniziare, assicurati di avere:

  • Node.js installato
  • Un’istanza di MongoDB in esecuzione (localmente o in cloud, ad esempio con MongoDB Atlas)
  • Conoscenza di base di GraphQL e Apollo Server

Step 1: Creazione del Progetto e Installazione delle Dipendenze

Inizia creando un nuovo progetto Node.js e installando le dipendenze necessarie:

mkdir my-graphql-api
cd my-graphql-api
npm init -y
npm install apollo-server graphql mongoose
  • apollo-server: La libreria per configurare il server GraphQL.
  • graphql: La libreria per definire e utilizzare GraphQL.
  • mongoose: Un ODM (Object-Document Mapper) per MongoDB, che facilita le operazioni con un database NoSQL.

Step 2: Configurazione di MongoDB con Mongoose

Connessione al Database

Crea un file chiamato db.js per gestire la connessione a MongoDB:

const mongoose = require("mongoose");

const connectDB = async () => {
  try {
    await mongoose.connect("mongodb://localhost:27017/mydatabase", {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log("MongoDB connected");
  } catch (err) {
    console.error("Error connecting to MongoDB", err);
    process.exit(1);
  }
};

module.exports = connectDB;

Sostituisci 'mongodb://localhost:27017/mydatabase' con il tuo URI MongoDB, che potrebbe includere credenziali di accesso o un URL per MongoDB Atlas.

Definizione di un Modello Mongoose

Definisci un modello per gestire i documenti nel database MongoDB. Crea un file models/User.js:

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
});

module.exports = mongoose.model("User", UserSchema);

In questo esempio, User è un modello che rappresenta un utente con un nome e un’email.

Step 3: Configurazione di Apollo Server con GraphQL

Crea il file index.js nella radice del progetto per configurare Apollo Server:

const { ApolloServer, gql } = require("apollo-server");
const connectDB = require("./db");
const User = require("./models/User");

// Connetti al database
connectDB();

// Definisci lo schema GraphQL
const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    users: [User]
    user(id: ID!): User
  }

  type Mutation {
    createUser(name: String!, email: String!): User
    updateUser(id: ID!, name: String, email: String): User
    deleteUser(id: ID!): Boolean
  }
`;

// Definisci i resolver
const resolvers = {
  Query: {
    users: async () => {
      return await User.find();
    },
    user: async (_, { id }) => {
      return await User.findById(id);
    },
  },
  Mutation: {
    createUser: async (_, { name, email }) => {
      const user = new User({ name, email });
      await user.save();
      return user;
    },
    updateUser: async (_, { id, name, email }) => {
      return await User.findByIdAndUpdate(id, { name, email }, { new: true });
    },
    deleteUser: async (_, { id }) => {
      await User.findByIdAndDelete(id);
      return true;
    },
  },
};

// Configura Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
});

// Avvia il server
server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});

Spiegazione del Codice

  • Schema GraphQL: Definiamo un tipo User, query per ottenere utenti (users, user), e mutazioni per creare, aggiornare e cancellare utenti (createUser, updateUser, deleteUser).
  • Resolvers: I resolver gestiscono l’interazione con MongoDB utilizzando Mongoose per eseguire operazioni CRUD (Create, Read, Update, Delete).

Step 4: Test dell’API GraphQL

Con il server avviato (node index.js), puoi testare l’API GraphQL utilizzando GraphQL Playground disponibile all’indirizzo http://localhost:4000/.

Esempio di Query per Ottenere Tutti gli Utenti

query {
  users {
    id
    name
    email
  }
}

Esempio di Mutazione per Creare un Nuovo Utente

mutation {
  createUser(name: "Alice", email: "alice@example.com") {
    id
    name
    email
  }
}

Esempio di Mutazione per Aggiornare un Utente

mutation {
  updateUser(id: "1", name: "Alice Updated", email: "alice.new@example.com") {
    id
    name
    email
  }
}

Esempio di Mutazione per Eliminare un Utente

mutation {
  deleteUser(id: "1")
}

Step 5: Best Practices

  1. Gestione degli Errori: Implementa una gestione robusta degli errori nei resolver per gestire eventuali problemi durante le operazioni con MongoDB.
  2. Validazione dei Dati: Utilizza Mongoose per convalidare i dati prima di salvarli nel database.
  3. Sicurezza: Proteggi le mutazioni sensibili implementando l’autenticazione e l’autorizzazione, specialmente per operazioni come la creazione e la cancellazione di documenti.
  4. Indice e Ottimizzazione delle Query: Utilizza indici su campi importanti per migliorare le prestazioni delle query MongoDB.

Conclusione

Integrare un database NoSQL come MongoDB in un’API GraphQL con Apollo Server è un processo relativamente semplice, ma estremamente potente. Questa configurazione ti permette di creare API scalabili e flessibili che possono crescere con le esigenze della tua applicazione. Seguendo questa guida, sarai in grado di configurare e utilizzare MongoDB in un progetto GraphQL, sfruttando appieno le potenzialità di entrambe le tecnologie.