访问Mongoose查询之外的变量

vatpfxk5  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(119)

我尝试用Mongoose查询所有用户,并将它们传递到res.render()中,以便能够在ejs文件中显示它们。

以下是我的代码:

const customersView = (req, res) => {

    const emailsArr = [];

    User.find({}, function(err, users) {
        users.forEach(function(user) {
            emailsArr.push(user.email);
        });

        console.log('Inside: ' + emailsArr);
        // I can put res.render() here
    });

    console.log('Outside: ' + emailsArr);

    // But I have to do some more queries here and then send them back all at once

    res.render('customers.ejs', {users: emailsArr});
}

但是,在User.find()之外,emailsArr是空的。

控制台输出:

[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
Server started
Connected to MongoDB
Outside: 
Inside: test@test,admin@admin

我可以把res.render()放在find()里面,但问题是我需要在这个用户查询之后有更多的查询,然后把所有的结果一次传递给ejs。我该怎么解决这个问题呢?

niknxzdl

niknxzdl1#

问题是“外部”代码在之前执行,因为User.find是一个回调,所以它在拥有用户之前不会执行,这就是为什么它在拥有用户之前不会执行。

const customersView = async (req, res) => {

  const emailsArr = [];

  const users = await User.find({}).catch(err => {
      // handle error here
  });

  //Your stuff
  users.forEach(function(user) {
    emailsArr.push(user.email);
  });

  console.log('Outside: ' + emailsArr);

  // But I have to do some more queries here and then send them back all at once

  res.render('customers.ejs', {users: emailsArr});
}

customersView函数更改为异步,并在User.find中使用await

相关问题