2012-04-23 183 views
2

我做了下面的函數來從ID獲取用戶名。它運作不好。 我可以編寫console.log(result.first_name);在查詢功能中,用戶名顯示在我的終端中,但不是瀏覽器。我試着在函數的末尾添加「返回」一些東西,以查看瀏覽器是否顯示出來 - 它的確如此。如何編寫函數以便返回查詢結果?從函數返回mongojs查詢結果

功能(在app.js全局函數)

function usernameFromId(id, callback){ 
    db.users.findOne({ _id: ObjectId(id.toString()) }, function(err, result) { 
     var first_name = result.first_name; 
     console.log(first_name); // names show up in the console… 
     callback(first_name); 
    }); 
}; 

頁處理程序(在app.js)

app.get('/books', function(req, res){ 
    function timeSince(dato){ 
     moment.lang('nb'); 
     return moment(dato).fromNow(); 
    }; 
    db.books.find().sort({ added:-1 }, function(err, docs) { 
     var books = docs; 
     db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { 
      var activity = docs; 
      res.render('books', { 
       books: books, 
       activity: activity, 
       timeSince: timeSince, 
       usernameFromId: usernameFromId 
      }) 
     }); 
    }); 
}); 

模板(books.jade)

- each a in activity 
    p=usernameFromId(a.user_id, function(name){return name;}) 

回答

-1

好吧,我找到了解決辦法。不確定它是否有用,但是有效。不需要功能。

頁處理程序(在app.js):

app.get('/books', function(req, res){ 
    db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { 
     var activity = docs; 
     db.users.find(function(err, docs) { 
      var users = docs; 
      res.render('books', { 
       page_title:'books', 
       activity: activity, 
       users: users 
      }) 
     }); 
    }); 
}); 

模板(books.jade):

- each a in activity 
    - for u in users 
     - if (a.user_id == u._id.toString()) 
      | #{u.first_name} 
+1

您可以將您的響應封裝在閉包中以使其更易於測試。然後將閉包作爲回調傳遞給查詢 - 這樣您就可以用模擬或其他不需要HTTP的東西替代它。看到我對我自己的類似問題的答覆在http://stackoverflow.com/questions/11972763/how-to-use-events-keep-mongodb-logic-out-of-node-js-request-handlers – fijiaaron 2012-08-27 16:01:34

+0

這似乎是一個非常冒險的解決方案。我認爲這會比重複嵌套的mongojs查詢更直觀。 – 2017-06-22 17:43:46

2

沒有因爲JavaScript的異步特性。我在代碼中添加了一些註釋以指示執行的實際順序。這就是你遇到錯誤的原因。

function usernameFromId(id){ 
    var id = id.toString(); // 1 
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) { 
     var first_name = result.first_name; // 3 
    }); 
    return first_name; // 2 
}; 

編輯:你可能要像下面

function usernameFromId(id, callback){ 
    var id = id.toString(); 
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) { 
     var first_name = result.first_name; 
     callback(first_name); 
    }); 
}; 
+0

我知道了,謝謝。所以我應該以不同的方式來解決這個問題? – Frode 2012-04-24 09:59:50

+0

看編輯只是作出 – deltanovember 2012-04-24 10:03:53

+0

我得到這個:「錯誤:TypeError:undefined不是一個函數」 – Frode 2012-04-24 10:23:09