2012-01-11 60 views
78

我在一個腳本中使用貓鼬並不意味着連續運行,而且我面對的似乎是一個非常簡單的問題,但我找不到答案;簡單地說,一旦我調用任何發送請求到mongodb的mongoose函數,我的nodejs實例就不會停止,我必須用Ctrl + c或Program.exit()手動殺死它。一旦你完成了,正確地關閉貓鼬的連接

代碼看起來大致是這樣的:

var mongoose = require('mongoose'); 

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ? 
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models 

// if I include this line for example, node never stop afterwards 
var MyModel = mongoose.model('MyModel', MySchema); 

我嘗試添加調用mongoose.disconnect(),但沒有造成。除此之外,一切工作正常(查找,保存,...)。

這是完全一樣的問題,因爲這個人,遺憾的是他沒有收到任何回答:https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

感謝

編輯:接受下面,因爲它在技術上是正確的答案,但如果有誰打這個問題再次出現,似乎貓鼬和/或mongodb驅動程序在您詢問是否仍有查詢正在運行時並未實際關閉連接。

它甚至完全不記得斷開連接調用,它在查詢完成運行後不會執行;它只是放棄你的調用,不會拋出任何異常,也不會真正關閉連接。

所以你有它:確保每個查詢已被處理之前調用disconnect()如果你想它實際工作。

+0

有沒有辦法做到這一點,只是從導入模型?下面的答案都不起作用:\ – Antoine 2016-02-04 03:29:30

回答

128

您可以關閉與

mongoose.connection.close() 
+14

這確實會關閉連接。然而,這個調用正在清除數據庫中的內容。當我切換到mongoose.disconnect()一切正常,我的摩卡測試開始正常工作 – 2014-05-23 22:55:14

+1

這對我有效。我只需要確保我把它放在正確的回調中,否則它可能在關閉連接之前保存到數據庫有機會完成。公平地說,我仍然使用一個簡單的腳本,它只連接到本地數據庫並保存一個簡單的示例用戶對象。在user.save()的回調函數中,我稱之爲mongoose.connection.close()。 – FateNuller 2015-12-01 22:49:00

+0

正如你所看到的,這些答案是舊的。如果您正在使用_Mongoose 5.0.4_,[Connection.close()'方法](http://mongoosejs.com/docs/api.html#connection_Connection-close)僅導出,只有可用,所以使用它。 – 2018-02-09 07:23:30

40

對方回答沒有爲我工作的連接。如this answer所述,我必須使用mongoose.disconnect();

+0

這在拆除測試環境時也是首選。 – 2017-01-11 20:30:31

+0

mongoose.disconnect()更適合使用和邏輯方法。 – 2018-01-07 06:28:59

8

您可以設置一個變量的連接再斷開連接當您完成:

var db = mongoose.connect('mongodb://localhost:27017/somedb'); 

// Do some stuff 

db.disconnect(); 
+0

在我的情況下(測試貓頭鷹內部的貓鼬)這是唯一的解決方案, – 2016-06-05 15:29:45

+0

我做Model.update(..)與Mongoose for循環。每次更新後是否需要關閉連接?我的服務器必須處理很多更新,並在一段時間後停止工作。 – Pille 2016-11-01 14:30:33

+0

同樣的答案如下 – DanFromGermany 2017-01-30 15:31:28

1

我使用其他答案的4.4.2版本,並沒有爲我工作。但是將useMongoClient添加到選項並將其放入一個變量中,您稱爲close似乎工作。

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true }) 

//do stuff 

db.close()