2012-12-21 33 views
3

我有一個一次性的Node腳本,它對MongoLab上的MongoDB數據庫進行了一些更改。但是,一旦完成,它永遠不會退出事件循環(我總是必須按Ctrl + C),無論調用我做多少db.close()db.logout()爲什麼我的Node.js腳本中的MongoClient不能完成?

奇怪的是,如果我啓動一個本地運行的實例mongod並連接到該腳本,那麼腳本結束了,但遠程連接永遠不會結束。

這是我的腳本的簡短版本,仍然存在問題(將URL連接到命令行上的服務器)。這是怎麼回事?

var mongodb = require("mongodb"); 

function onSuccess(cb){ 
    return function(err) { 
    if (err) { 
     console.error(err) 
    } else { 
     cb.apply(this,Array.prototype.slice.call(arguments,1)) 
    } 
    } 
} 

console.log("Connecting to "+process.argv[2]+' ...'); 
mongodb.MongoClient.connect(process.argv[2],onSuccess(function(db){ 
    console.log("Connected."); 
    db.logout(onSuccess(function(logoutResult){ 
    db.close(onSuccess(function(closeResult){ 
     console.log("All finished. Can has prompt return nao?") 
    })); 
    })); 
})); 
+0

我完全按照原樣運行此代碼,並且它自己關閉就好了。 – JohnnyHK

+0

您提供了連接到的服務器嗎?如果遇到錯誤,它將自行關閉,但這是一個錯誤。 –

+0

是的,我運行'node app.js「mongodb:// localhost:27017/test」',它連接到我的本地實例,然後在輸出Connected.'和All'後關閉。可以提示返回nao?' – JohnnyHK

回答

1

剛試過的代碼驅動程序版本1.2.7/1.2.8和最新的1.2.9對蒙古語和它正常工作。所以更有可能它是一個奇怪的驅動程序/操作系統/節點版本的組合,這是造成這種情況。我建議將節點和驅動程序升級到最新版本,然後重試。

+0

這應該是一個評論,而不是一個答案。 – JohnnyHK

+0

我接受它作爲答案,因爲它實際上解決了我的問題。 –

1

我懷疑它與您定義封閉的方式有關,但我無法完全放下手腳。

對於什麼是值得的,下面是我使用的方法,這會關閉連接預期:

MongoClient.connect(dbUrl, function(err, db) { 

    if(err) return callback(err); 

    var collection = db.collection(dbCollection); 
    collection.find().toArray(function(err, items){ 

    db.close() 
    if(err) return callback(err); 
    callback(null, items); 

    }); 

}); 

你可以找到一個完整的例子在這裏:https://github.com/hectorcorrea/mongoDbSample

+0

不,這不是 - 我只是測試過,我的腳本對本地連接起作用,而且腳本對遠程連接也有同樣的問題。 –

相關問題