in How To

How to: MongoError – Topology was destroyed via Mongoose

Una applicazione basata su NodeJS e MongoDB dopo un aggiornamento ha iniziato a non funzionare ed è apparso il messaggio di errore MongoError – Topology was destroyed.

L’accesso al database è gestito attraverso il modulo Mongoose.

Il problema potrebbe essere dovuto ai parametri di accesso al database utilizzati per la connessioni al database mongo. Ma andiamo per gradi.

Intanto appena letto il messaggio c’è stato un attimo di… paura! Che cosa vuol dire errore MongoError – Topology was destroyed? destroyed??? Si sono cancellati tutti i dati nel database??? Libera!! Lo stiamo perdendo!! Confessate, la procedura di backup del server non era ancora attiva. Capita spesso.

Per mia fortuna il backup era attivo e funzionante quindi, con calma, accedo al database e verifico cosa sta accadendo al database MongoDB.

Utilizzando una shell bash accedo nel server e verifico se MongoDB sia attivo e raggiungibile. L’accesso da riga di comando richiede almeno i parametri dell’indirizzo ip del server e la porta in cui MongoDB è in ascolto. Questo il link per la documentazione ufficiale dove recuperare le informazioni.

mongo --host 127.0.0.1 --port 27017

Il risultato dell’accesso al database è

MongoDB shell version v3.4.10
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.4.10

Quindi, il server sta funzionando ed è raggiungibile. Bene.

Ora verifichiamo se i dati sono presenti nel database.

Per verificale l’elenco dei database presenti si può utilizzare il comando

>show databases;
admin       0.001GB
data        0.002GB
local       0.001GB

e verifichiamo che ci siano dati presenti nel database data attraverso il comando.

dopo aver selezionato il database nel quale accedere tramite il comando  
>use data;

Si può verificare il numero di oggetti presenti nella collection attraverso il comando

>db.collection.find({}).count();

Nel mio caso il nome della collection è info quindi il comando sarà

>db.info.find({}).count();

Il risultato sarà semplicemente il numero di oggetti recuperati attraverso il filtro indicato nell’oggetto JSON “{}” che equivale a nessun filtro.

Il database è a posto. Procediamo con il codice utilizzato per accedere al database. In questo caso il codice sorgente è stato realizzato con NodeJS e l’interfaccia verso il database realizzata con la libreria Mongoose.

Verifichiamo il codice dove si attiva la connessione al database

mongoose.connect('mongodb://localhost/data');

La connessione al database non ha specificati parametri di accesso. I parametri possono essere passati nella funzione connect.

In questi andrò a specificare il formato dell’uri attraverso l’opzione useNewUrlParser e forzo il protocollo IP ad utilizzare indirizzo v4.

const connectionOptions = {
  useNewUrlParser: true,
  family: 4 
};

Imposto la funzione connect di Mongoose per utilizzare questi parametri e tento il riavvio dell’applicazione.

mongoose.connect( 'mongodb://localhost/data', connectionOptions );

Tutto ha ripreso a funzionare. Nel mio caso problema risolto.

Scrivi un commento

Commento