2011-06-13 83 views
4

我不能爲我的生活得到貓鼬在我的快速應用程序工作。我已經安裝貓鼬,並通過NPM mongodb(貓鼬文檔沒有說明是否需要mongodb單獨或如何啓動和運行)。快遞app nodejs和貓鼬db/mongodb開始

這裏是我使用的代碼。

var mongoose = require('mongoose'); 
    mongoose.connect('mongodb://127.0.0.1/my_database'); 

    var Schema = mongoose.Schema, ObjectId = Schema.ObjectId; 

    var Comments = new Schema({ 
     title  : String 
     , body  : String 
     , date  : Date 
    }); 

    var BlogPost = new Schema({ 
     author : ObjectId 
     , title  : String 
     , body  : String 
     , date  : Date 
     , comments : [Comments] 
     , meta  : { 
      votes : Number 
      , favs : Number 
     } 
    }); 

    var BlogPost = mongoose.model('BlogPost', BlogPost); 
    var post = new BlogPost(); 
    post.title='blahblah'; 
    // create a comment 
    post.comments.push({ title: 'My comment' }); 

    post.save(function (err) { 
     if(err){ 
      throw err; 
      console.log(err); 
     }else{ 
      console.log('saved!'); 
     } 
    }); 

任何人都知道我在做什麼錯?我不知道我是否需要以某種方式單獨啓動mongodb(它看起來像mongoose.connect函數啓動mongodb服務器吧?)

但是,當我啓動我的應用程序時(並且它應該輸出無論是錯誤或保存!我的控制檯時,我保存測試後吧?

反正任何幫助將非常感謝!

感謝

+0

這裏是你開始演示http://goo.gl/HlbXE – Madhusudhan 2011-06-15 22:28:31

回答

2

MongoDB是一個完全獨立的服務,因此必須已經運行nodejs來訪問它。

您沒有看到任何輸出的原因是因爲您的程序在您的帖子完成之前結束,或者在這種情況下由於無法到達MongoDB而超時。

編輯

如果你仍然好奇,爲什麼你沒有看到MongoDB的時候並沒有運行任何輸出,停止MongoDB中,修改您的應用程序包括:

// exit program in one minute with an error 
// cancelled if we can successfully talk to MongoDB 
var sentinel = setTimeout(function(){ 
    throw "failed to connect to MongoDB after one minute!"; 
}, 60*1000); // 60 seconds 

post.save(function (err) { 

    clearTimeout(sentinel); // cancel the timeout sentinel 

    if(err){ 
     throw err; 
     console.log(err); // won't occur since the throw will end the program 
    }else{ 
     console.log('saved!'); 
    } 
}); 

process.stdin.resume(); // read from stdin to keep program running 

並重新運行。

認識到nodejs不像大多數編程環境一樣重要,因爲它在一個事件循環內運行程序,只要它有事可做就可以運行。如果無事可做,nodejs將退出。

而且由於你的post.save()啓動了一個新的異步調用MongoDB,並且立即返回,應用程序將立即退出,因爲沒有別的辦法可以做。 (在封面下,post.save()只是簡單地向事件循環添加一個新的事件處理程序,以監視完成的調用。)

爲了確保您的程序不會立即退出,我們添加process.stdin.resume()指示事件循環來檢查每次傳入的新輸入(來自標準輸入),從而使您的程序永久運行。

基於Nodejs的網絡服務器依靠相同的機制連續運行,監視來自網絡套接字的輸入而不是標準輸入。

我不能強調事件循環概念對於nodejs中編程的重要性。我估計有75%或更多的人報告讓nodejs做他們需要的問題可能歸因於不瞭解事件循環以及它如何影響nodejs編程模型!

+0

你確定嗎?因爲我剛剛添加了:var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1/my_database'); console.log(mongoose.connection。主辦); console.log(mongoose.connection.port); - 它顯示它連接到端口27017上的mongodb - 如果我必須啓動它(我不認爲它會連接到mongo,如果它沒有啓動),那麼我如何在本地爲我的快速應用程序啓動它? – thrice801 2011-06-13 18:55:53

+0

我確定。你確定MongoDB沒有運行嗎?同時打印出主機和端口並不能保證連接已經建立。 – 2011-06-13 18:58:56

+0

你的代碼最大的問題是nodejs在你的帖子有機會完成之前結束,因爲post是異步執行的。 – 2011-06-13 19:02:44