2013-07-08 26 views
1

嘿我想從我的index.js文件中查詢數據庫(mongodb),然後將查詢中的值返回到變量中,以便我可以使用該變量在網站上顯示個人信息。我目前有這個代碼,但它給我的問題。試圖找出如何以正確的方式來查詢它。我正在查詢電子郵件,但我想根據電子郵件查詢提取名字。我爲我的視圖引擎使用node.js和jade。簡單的db mongo查詢出錯了嗎?

var mongoose = require('mongoose') 
    , db = mongoose.createConnection('mongodb://localhost/test5'); 

var user = function (name) { 
    var name = db.users.find({ email: '[email protected]' }).pretty(); 
    console.log(name); 
    return name; 
}; 

exports.index = function(req, res) { 
    res.render('index', { title: 'Weblio', user: user}); 
}; 

回答

4

它看起來像你使用的是Mongoose,所以我建議你使用他們的查詢函數,這些函數在過去對我來說效果很好。它也有助於爲存儲在MongoDB中的數據建立Mongoose模型。

試試這個(注:這是未經測試,但我把它從運作程序):

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test5'); 

var UserSchema = new Schema({ 
    email: { type: String, index: true }, 
    firstName: { type: String }, 
    lastName: { type: String } 
}); 

mongoose.model('User', UserSchema); 

var User = mongoose.model('User'); 

exports.index = function(req, res) { 
    User.findOne({ 
     email: "[email protected]" 
    }, function(err, user) { 
     if(err) { 
      res.send(err); 
     } else { 
      console.log(user.firstName); 
      res.render('index', {title: 'Weblio', user: user.firstName}); 
     } 
    }); 
} 
+0

感謝的是工作,是的,我有一個用戶模型不知道如果我可以用它這樣。做res.send(err)或req.send(500)更好嗎? – Lion789

+0

您是否希望用戶看到錯誤,取決於您。你可以對用戶執行'res.send(500)',也許'console.log(err)'可以看到它。 – jrthib

+0

有道理,對於這種情況或人們通常採用的路線,最佳做法是什麼? – Lion789

1

幾乎所有IO在節點是異步的,這意味着你的查找方法是不會返回實際的結果,但一個承諾或它期待一個回調,它會調用的結果。

試試這個:

var mongoose = require('mongoose') 
    , db = mongoose.createConnection('mongodb://localhost/test5'); 


exports.index = function(req, res) { 
    db.users.find({ email: '[email protected]' }, function(err, data){ 
    if(err){ 
     return req.send(500); 
     } 
    res.render('index', { title: 'Weblio', user: JSON.stringify(data)}); 
    }); 
}; 
+0

findOne比找到的更好,這兩個調用之間的區別是什麼?假定您正在搜索的內容是唯一的,並且您只搜索一個用戶? – Lion789

+0

'findOne'只是返回找到的第一個結果,而不是搜索整個集合。我相信你也可以使用普通的'find'查詢來設置一個限制。在通過電子郵件地址進行搜索的情況下,它們很可能是獨一無二的,因此返回它找到的第一個是有意義的。但它確實取決於你的數據集。 – jrthib

+0

還好,這是一個聰明的方式來查詢數據庫,每當你想拉起用戶的個人資料在網頁上?我最終試圖做的是從登錄的用戶那裏獲取一個cookie,並使用該電子郵件查詢他的信息並在用戶配置文件頁面上向他顯示他的信息。我也在使用骨幹,因此從骨幹獲取信息而不是像這樣查詢會更好。 – Lion789