мангуст найти результаты не освежающие - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю с Express / Jade / Mongodb, чтобы создать сайт с БД (довольно новый в этом). Я получаю список из БД, используя 'mongoose find' во время метода 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 голосов
/ 08 ноября 2018

Для каждого вызова 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...