Использование двух коллекций в MongoDB с Mongoose - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок в NodeJS, и я использую следующее: Express Паспорт Mongoose

HI У меня есть две коллекции в MongoDB, они обе не имеют никакого отношения друг к другу, они Вызваны:

Post

и

User

В маршруте получения для /home в выражении IF Я пытаюсь запросить информацию из обеих коллекций и представить ее в E JS стр. Мои первые мысли были создать find для одного хранилища моделей в var, а затем использовать его в другой функции при рендеринге страницы.

Вот соответствующий код:

app.get("/home", function(req, res){
  console.log(req.user._id);
  if (req.isAuthenticated()){
    // //*Find current logged in user details
    User.find({_id: req.user._id}, function(err, users){
      var currentUserName = req.user.name
      });

    //*end
    Post.find({}, function(err, posts){
      res.render("home", {
        startingContent: homeStartingContent,
        posts: posts,
        currentUser: currentUserName
        });
    });

  } else {
    res.redirect("login")
  }
});

В начале моего js файла я объявил

var currentUserName

Но его значение не отображается в the home.e js для:

<p><%= currentUser %></p>

Это просто пусто.

Что я здесь не так делаю? Я думал, использование var сделает его глобальной переменной, а затем может быть использован в другой функции? Другие посты предлагают совокупность, но эти коллекции полностью разделены и не имеют ничего общего друг с другом.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Вы определили currentUserName внутри User.find(){...} функции, и она доступна только внутри этой функции. Вам нужно определить переменную, которая может быть ограничена блоком, вне функции User.find(){...}. Посмотрите фрагмент кода ниже:

app.get("/home", function(req, res){
  console.log(req.user._id);
  if (req.isAuthenticated()){
    let currentUserName;
    // //*Find current logged in user details
    User.find({_id: req.user._id}, function(err, users){
      currentUserName = req.user.name
      });

    //*end
    Post.find({}, function(err, posts){
      res.render("home", {
        startingContent: homeStartingContent,
        posts: posts,
        currentUser: currentUserName
        });
    });

  } else {
    res.redirect("login")
  }
});

Javascript В соответствии с рекомендациями лучше использовать let вместо var. Переменные, объявленные ключевым словом var, попадают в область непосредственного тела функции, т. Е. User.find(){...}, в то время как переменные допускаются в область непосредственного включения, обозначенную {}, то есть if(req.isAuthenticated()){...}.

0 голосов
/ 06 апреля 2020

Это не сработает, потому что у каждой переменной есть область видимости. Область действия означает доступ к использованию этой переменной. В этом случае currentUserName имеет область действия или может использоваться только в разделе User.find(). Если вы хотите использовать его в Post.find (), сделайте это, объявив его в основной функции, как показано ниже.

app.get("/home", function(req, res){
  console.log(req.user._id);
  let currentUserName;
  if (req.isAuthenticated()){
    User.find({_id: req.user._id}, function(err, users){
      currentUserName = req.user.name
      });

    Post.find({}, function(err, posts){
      res.render("home", {
        startingContent: homeStartingContent,
        posts: posts,
        currentUser: currentUserName
        });
    });

  } else {
    res.redirect("login")
  }
});

Он будет работать так, как вам нужно, объявив currentUserName в основной функции, поэтому он будет использоваться во всей основной app.get() функции

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