我正在与express / jade / mongodb一起创建一个带有数据库的站点(在此非常新)。 我在使用此功能的get方法期间使用“猫鼬查找”功能从数据库中检索列表:
function getBookList(Book, req, callback){
Book.find({'username': req.user.username}, 'bookTitle author', function(err, userBooks) {
if (err) return handleError(err);
else if (userBooks.length > 0) {
bookList.push(userBooks);
callback();
}
});
};
router.get('/', ensureAuthenticated, function(req, res, next) {
getBookList(Book, req, function(){
res.locals.user.books = bookList[0];
res.render('index', { title: 'library' });
});
});
在我的玉文件中,代码是:
ul
each book in user.books
li #{book.bookTitle}
span -
span #{book.author}
我第一次与用户登录时,将按预期方式获得该列表,但是如果我向数据库中添加文档并再次呈现该页面,则该页面上的列表不会更新并保持原样。 即使注销和再次登录后,它也保持不变。仅在重新启动服务器后,列表才会更新。 谁能向我解释我在做什么错?
答案 0 :(得分:2)
对于每个对getBookList
的调用,您都将结果书阵列推入另一个数组bookList
。
因此,假设您在数据库中有一个文档,然后调用getBookList
。之后,bookList
看起来像这样:
bookList = [ [ 'book 1' ] ]
然后添加另一本书,然后再次致电getBookList
。现在bookList
看起来像这样:
bookList = [ [ 'book 1' ], [ 'book 1', 'book 2' ] ]
但是,您只使用过bookList[0]
,因此第一次调用getBookList
的结果。它永远不会包含新文档,因为这些文档只会出现在以后bookList
的条目中。
这并不是要解决的最大问题,因为您正在使用bookList
作为全局变量,但这不是一个好主意。相反,getBookList
应该将书籍清单传回给呼叫者。
这会使代码看起来像这样:
function getBookList(username, callback){
Book.find({'username': username}, 'bookTitle author', function(err, userBooks) {
callback(err, userBooks);
});
};
router.get('/', ensureAuthenticated, function(req, res, next) {
getBookList(req.user.username, function(err, userBooks) {
if (err) return handleError(err);
else if (userBooks.length > 0) {
res.locals.user.books = userBooks;
res.render('index', { title: 'library' });
} else {
// handle the situation where no books were found
...
}
});
还有其他一些更改,例如将getBookList
与模型(Book
)和请求(req
)分离。