猫鼬发现结果不令人耳目一新

时间:2018-11-08 20:17:36

标签: node.js mongodb express mongoose pug

我正在与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}

我第一次与用户登录时,将按预期方式获得该列表,但是如果我向数据库中添加文档并再次呈现该页面,则该页面上的列表不会更新并保持原样。 即使注销和再次登录后,它也保持不变。仅在重新启动服务器后,列表才会更新。 谁能向我解释我在做什么错?

1 个答案:

答案 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)分离。