Node.js
Integrazione MongoDB per Node.js / Express.js
Ricerca…
introduzione
MongoDB è uno dei più popolari database NoSQL, grazie all'aiuto dello stack MEAN. Interfacciare con un database Mongo da un'app Express è semplice e veloce, una volta compresa la sintassi della query. Useremo Mongoose per aiutarci.
Osservazioni
Ulteriori informazioni possono essere trovate qui: http://mongoosejs.com/docs/guide.html
Installare MongoDB
npm install --save mongodb
npm install --save mongoose //A simple wrapper for ease of development
Nel file del tuo server (normalmente denominato index.js o server.js)
const express = require('express');
const mongodb = require('mongodb');
const mongoose = require('mongoose');
const mongoConnectString = 'http://localhost/database name';
mongoose.connect(mongoConnectString, (err) => {
if (err) {
console.log('Could not connect to the database');
}
});
Creazione di un modello Mongoose
const Schema = mongoose.Schema;
const ObjectId = Schema.Types.ObjectId;
const Article = new Schema({
title: {
type: String,
unique: true,
required: [true, 'Article must have title']
},
author: {
type: ObjectId,
ref: 'User'
}
});
module.exports = mongoose.model('Article, Article);
Analizziamo questo. MongoDB e Mongoose usano JSON (in realtà BSON, ma qui è irrilevante) come formato dei dati. Nella parte superiore, ho impostato alcune variabili per ridurre la digitazione.
Creo un new Schema
e lo assegno a una costante. È semplice JSON e ogni attributo è un altro oggetto con proprietà che consente di applicare uno schema più coerente. Forze univoche che le nuove istanze vengono inserite nel database, ovviamente, sono uniche. Questo è ottimo per evitare che un utente possa creare più account su un servizio.
Required è un altro, dichiarato come array. Il primo elemento è il valore booleano e il secondo il messaggio di errore se il valore inserito o aggiornato non esiste.
I ObjectID sono usati per le relazioni tra i Modelli. Gli esempi potrebbero essere "Gli utenti hanno molti commenti". Altri attributi possono essere usati al posto di ObjectId. Le stringhe come un nome utente sono un esempio.
Infine, l'esportazione del modello da utilizzare con le rotte API consente l'accesso al tuo schema.
Interrogare il tuo database Mongo
Una semplice richiesta GET. Supponiamo che il Modello dell'esempio precedente sia nel file ./db/models/Article.js
.
const express = require('express');
const Articles = require('./db/models/Article');
module.exports = function (app) {
const routes = express.Router();
routes.get('/articles', (req, res) => {
Articles.find().limit(5).lean().exec((err, doc) => {
if (doc.length > 0) {
res.send({ data: doc });
} else {
res.send({ success: false, message: 'No documents retrieved' });
}
});
});
app.use('/api', routes);
};
Ora possiamo ottenere i dati dal nostro database inviando una richiesta HTTP a questo endpoint. Alcune cose chiave, però:
- Limit fa esattamente quello che sembra. Ricevo solo 5 documenti.
- Lean elimina alcune cose dal BSON grezzo, riducendo la complessità e il sovraccarico. Non richiesto. Ma utile
- Quando usi
find
invece difindOne
, conferma chedoc.length
è maggiore di 0. Questo perchéfind
restituisce sempre un array, quindi un array vuoto non gestirà il tuo errore a meno che non venga controllato per la lunghezza - Personalmente mi piace inviare il messaggio di errore in quel formato. Modificalo in base alle tue esigenze. Stessa cosa per il documento restituito.
- Il codice in questo esempio è stato scritto supponendo di averlo inserito in un altro file e non direttamente sul server Express. Per chiamare questo nel server, includere queste righe nel codice del server:
const app = express();
require('./path/to/this/file')(app) //