2015-04-04 19 views
11

Próbuję połączyć się z moim mongodb używając nodejs i socket.io. Jestem w stanie połączyć się z bazą danych, ponieważ otrzymuję „połączenie zaakceptowane” w moim konsoli ale na nodejs boku, jak tylko - w istocie - dostać'process.nextTick (function() {throw err;})' - Undefined nie jest funkcją (mongodb/mangusta)

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

razu nie dalej z

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

I tu idzie 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); 
     }); 
    } 
    }); 

} 

A oto treść mojego folderu bazy:

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

Uruchamiam mongodb wpisując mongod --dbpath folder i pomyślnie "oczekuje połączeń na porcie 27017".

Również moi node_modules z package.json (npm)

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

Dziękuję bardzo za pomoc ...

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:

Ja także mając te problemy podczas próby uruchomienia nodejs instancję:

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

Próbowałem mocując je jako inne pytania tutaj powie, ale nic nie działało albo ...

+0

Czy możesz opublikować rzeczywisty ślad stosu, który zostanie wydrukowany? To powinno Ci powiedzieć * gdzie * w 'showCollections()' pochodzi błąd. – mscdex

+0

@mscdex Jak mogę wydrukować ślad stosu? czy ma być domyślnie drukowany? – Fane

+0

Tak, powinna była zostać wyświetlona pod pojawieniem się TypeError. – mscdex

Odpowiedz

25

Z dostarczonych informacji, wygląda używasz MongoDB 2.0 sterownik . Metoda db.collectionNames została usunięta. Sprawdź sekcję "Obiekt Db" tej strony - https://github.com/mongodb/node-mongodb-native/blob/0642f18fd85037522acf2e7560148a8bc5429a8a/docs/content/tutorials/changes-from-1.0.md#L38

Zostały one zastąpione przez listęCollections. Powinieneś uzyskać ten sam efekt z:

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

Na wypadek, gdyby pomogło: Próbowałem użyć 'listCollectionsAsync()' po użyciu niebieskiego 'Promise.promisifyAll (mongoose.connection.db)' + pakietu 'asyncawait', bez powodzenia (zawiesza się podczas wywoływania' listCollectionsAsync() ' bez powodu). Jednak po 'console.log (mongoose.connection.db)' do sprawdzenia dostępnych metod znalazłem nieudokumentowane 'collectionsAsync()', które działa doskonale O_o (mangusta 4.3.7) –

0

Jeśli nie określa pełna ścieżka i moduł eksportu?
... coś jak:

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

Jeśli się mylę to dlatego, że nie lubią moongodb :)

+0

Naprawdę nie sądzę, że to jest konieczne, jeśli mam twój punkt ... Nie sądzę, że mój problem leży tam ... – Fane

+0

Jaki jest wynik, jeśli uruchomisz db.getCollectionNames()? –

+0

to samo ... więc z jakiegoś powodu problem może dotyczyć nazw kolekcji! – Fane