2015-04-04 53 views
11

我試圖使用nodejs和socket.io連接到我的mongodb。我能,因爲我得到儘快連接到數據庫,在我的控制檯,但上的NodeJS側「接受的連接」,因爲我 - 事實上 - 取得'process.nextTick(function(){throw err;})' - 未定義不是函數(mongodb/mongoose)

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

立即與

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

下次故障

而且這裏去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); 
     }); 
    } 
    }); 

} 

這裏是我的數據庫文件夾的內容:

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

我運行mongodb,輸入mongod --dbpath文件夾併成功'等待端口27017上的連接'。

此外,從的package.json(NPM)我node_modules

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

非常感謝您的幫助...

堆棧跟蹤:

> 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) 

編輯:

我試圖運行實例的NodeJS時以及有這些問題:

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

我試圖修復他們其他的問題在這裏要告訴但是毫無效果要麼...

+0

你可以發佈打印出來的實際堆棧軌跡嗎?這應該告訴你* showCollections()中的錯誤來自哪裏。 – mscdex 2015-04-04 17:33:22

+0

@mscdex如何打印堆棧跟蹤?它應該默認打印? – Fane 2015-04-04 17:39:10

+0

是的,它應該在你得到的TypeError下顯示。 – mscdex 2015-04-04 17:42:30

回答

25

從提供的信息,它看起來像你正在使用的MongoDB 2.0驅動程序。 db.collectionNames方法被刪除。查看本頁面的「Db對象」部分 - https://github.com/mongodb/node-mongodb-native/blob/0642f18fd85037522acf2e7560148a8bc5429a8a/docs/content/tutorials/changes-from-1.0.md#L38

他們用listCollections替換了它。你應該得到相同的效果:

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

如果有幫助:在使用bluebird的'Promise.promisifyAll(mongoose.connection.db)'包'asyncawait'後試圖使用'listCollectionsAsync()',但沒有成功(調用'listCollectionsAsync()沒原因)。然而,在檢查可用方法的'console.log(mongoose.connection.db)'後,我發現了一個完全可以工作的未公開的'collectionsAsync()'O_o(mongoose 4.3.7) – 2016-09-27 09:44:07

0

你不應該指定完整的路徑並有一個導出模塊?
...是這樣的:

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

如果我錯了,那是因爲我不喜歡moongodb :)

+0

我真的不認爲這是必要的,如果我明白你的觀點...我不認爲我的問題在那裏...... – Fane 2015-04-04 17:26:29

+0

如果你運行db.getCollectionNames(),結果如何? – 2015-04-04 17:43:21

+0

也一樣...所以問題可能是獲取集合名稱,無論出於何種原因! – Fane 2015-04-04 18:22:29