2012-01-10 84 views
2

對於一些特殊情況,比如'require',阻止執行是有意義的,以使事情變得更簡單。連接到Node.JS中的數據庫

我有一個類似的情況,我需要一種方法來使數據庫連接,封鎖。 而且,因爲它只發生一次 - 當應用程序啓動並保存在全局對象中供以後重用時,它不會影響性能。

的問題:

  1. 節點沒有 '睡眠' 的方法。
  2. 有事件循環的一些技巧,你必須阻止它,但同時允許處理它的數據庫連接的東西。

其實我已經做到了,通過使用waitFor從茉莉節點,但是當我看着它源 - 這是非常複雜的,並使用phantomjs C-擴展。

可悲的是,簡單的while(true){...}的東西不起作用。例如,下面的代碼不起作用,我相信它阻止了事件循環,並且不允許節點處理它等待的事件(單線程環境中的某種死鎖:))。

waitsFor = (fun, message = "waitsFor timeout!", timeout = 1000) -> 
    start = new Date().getTime() 
    while true  
     if fun() 
     break 
     else if (new Date().getTime() - start) > timeout 
     throw new Error(message) 

但是,也許是在某種程度上可以做到這一點在其他一些簡單的方法,而無需額外的依賴像phantomjs和複雜的C-擴展?

+0

爲什麼不等到啓動應用程序,直到數據庫連接建立? 'db.connect(function(err){... start app here ...});保存在全局對象中以備後用的' – 2012-01-10 17:57:15

+3

「聽起來不太好。 – 2012-01-10 18:00:13

回答

4

您的應用程序應首先嚐試異步連接到數據庫,然後在連接可用時繼續執行其處理邏輯。例如:

db.connect(function(conn, err) { 
    if (err) throw err; 
    // Put your program logic using the db connection here... 
}); 
+2

+1,看起來OP正試圖使用​​NodeJS,它的使用方式並不是打算使用它。任何通常長的阻塞調用都應該異步完成(DB訪問,文件訪問等) – 2012-01-10 18:36:55