2015-04-04 5 views
11

Sto provando a connettermi al mio mongodb utilizzando nodejs e socket.io. Sono in grado di connettersi al database perché ricevo 'connessione accettato' nella mia console, ma sul lato nodejs, non appena ho - anzi - ottenere'process.nextTick (function() {throw err;})' - Undefined non è una funzione (mongodb/mangusta)

Connection to mongodb://localhost:27017 established through mongoose

non riesce immediatamente successivo con

process.nextTick(function() { throw err; }) ^TypeError: undefined is not a function at showCollections**

E qui vale showCollections:

var showCollections = function(db, callback) { 
    mongoose.connection.db.collectionNames(function(error, names) { 
    if (error) { 
     throw new Error(error); 
    } else { 
     console.log("=>Listening mongo collections:"); 
     names.map(function(cname) { 
     mongoose.connection.db.dropCollection(cname.name); 
     console.log("--»"+cname.name); 
     }); 
    } 
    }); 

} 

E qui è il contenuto della mia cartella di database:

_tmp (empty folder) 
local.0 
local.ns 
mongod.lock 

Eseguo il file mongodb digitando mongod --dbpath folder e "attende con successo le connessioni sulla porta 27017".

Inoltre, i miei node_modules da package.json (NPM)

"dependencies": { 
    "express": "^4.9.6", 
    "socket.io": "latest", 
    "mongodb": "~2.0", 
    "mongoose": "*" 
    } 

La ringrazio molto per il vostro aiuto ...

StackTrace:

> TypeError: undefined is not a function 
>  at showCollections (/usr/share/nginx/www/index.js:77:25) 
>  at NativeConnection.callback (/usr/share/nginx/www/index.js:46:3) 
>  at NativeConnection.g (events.js:199:16) 
>  at NativeConnection.emit (events.js:104:17) 
>  at open (/usr/share/nginx/www/node_modules/mongoose/lib/connection.js:485:10) 
>  at NativeConnection.Connection.onOpen (/usr/share/nginx/www/node_modules/mongoose/lib/connection.js:494:5) 
>  at /usr/share/nginx/www/node_modules/mongoose/lib/connection.js:453:10 
>  at /usr/share/nginx/www/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:59:5 
>  at /usr/share/nginx/www/node_modules/mongoose/node_modules/mongodb/lib/db.js:200:5 
>  at connectHandler (/usr/share/nginx/www/node_modules/mongoose/node_modules/mongodb/lib/server.js:272:7) 

EDIT:

che sto così avere questi problemi quando si cerca di eseguire l'istanza nodejs:

{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' } 
js-bson: Failed to load c++ bson extension, using pure JS version 

Ho provato fissandole come altre domande qui avrebbero detto, ma niente ha funzionato o ...

+0

È possibile pubblicare la traccia di stack effettiva che viene stampata? Questo dovrebbe dirti * dove * in 'showCollections()' ha origine l'errore. – mscdex

+0

@mscdex come posso stampare la traccia dello stack? dovrebbe essere stampato di default? – Fane

+0

Sì, avrebbe dovuto essere visualizzato sotto l'errore TypeError che hai ottenuto. – mscdex

risposta

25

Dalle informazioni fornite, sembra che si sta usando MongoDB 2.0 driver . Il metodo db.collectionNames è stato eliminato. Controlla la sezione "Db Object" di questa pagina - https://github.com/mongodb/node-mongodb-native/blob/0642f18fd85037522acf2e7560148a8bc5429a8a/docs/content/tutorials/changes-from-1.0.md#L38

Lo hanno sostituito con listCollections. Si dovrebbe ottenere lo stesso effetto con:

mongoose.connection.db.listCollections().toArray(function(err, names) { 
    if (err) { 
     console.log(err); 
    } 
    else { 
     names.forEach(function(e,i,a) { 
      mongoose.connection.db.dropCollection(e.name); 
      console.log("--->>", e.name); 
     }); 
    } 
}); 
+0

Nel caso in cui aiuti: ho provato a usare 'listCollectionsAsync()' dopo aver usato il comando 'Promise.promisifyAll (mongoose.connection.db) di bluebird + pacchetto' asyncawait', senza successo (si blocca quando si chiama 'listCollectionsAsync()' per nessuna ragione). Comunque dopo un 'console.log (mongoose.connection.db)' per controllare i metodi disponibili ho trovato un 'collectionsAsync()' senza documentazione che funziona perfettamente O_o (mangusta 4.3.7) –

0

Non dovresti specificare il percorso completo e un modulo di esportazione?
... qualcosa di simile:

mongoose.connection.db.collectionNames(function (err, names) 
{ 
     console.log(names); // [{ name: 'dbname.myCollection' }] 
     module.exports.Collection = names; 
} 

Se mi sbaglio è perché non avete voglia di moongodb :)

+0

Non penso che sia necessario, se ho capito il tuo punto ... Non penso che il mio problema si trova lì ... – Fane

+0

Qual è il risultato se si esegue db.getCollectionNames()? –

+0

lo stesso ... quindi il problema potrebbe essere ottenere i nomi della raccolta, per qualsiasi motivo! – Fane

Problemi correlati