【问题标题】:Query data in EJS with NodeJS and Mongoose使用 NodeJS 和 Mongoose 在 EJS 中查询数据
【发布时间】:2020-05-16 19:09:21
【问题描述】:

我已经捕获数据并通过这样做来显示它们:

const items = [];

Task.find({},(err,tasks)=>{
    if(err){
        console.log(err);
    }else{
        tasks.forEach((task)=>{
            items.push(task.name);
        })
    }
})

app.get("/", (req, res) => {
    today = date.getDate();
    res.render('list', { kindOfDay: today, items: items });
})

但是当我尝试这样做时,它无法显示数据而没有任何错误:

app.get("/", (req, res) => {
    const items = [];

    Task.find({}, (err, tasks) => {
        if (err) {
            console.log(err);
        } else {
            tasks.forEach((task) => {
                items.push(task.name);
                //console.log(task.name) still works
            })
        }
    });

    today = date.getDate();
    res.render('list', { kindOfDay: today, items: items });
})

有人知道为什么上面的代码在我呈现“列表”页面时拒绝显示数据吗? 谢谢!

【问题讨论】:

  • res.render在items数组被填充之前执行,因为nodejs是异步的,所以将task.find包裹在async await函数中,以便res.render在处理完成后调用
  • 或者你可以尝试将渲染代码放在Task.find函数的范围内
  • 在从 db 获取数据时使用 async await 就可以了

标签: node.js mongoose ejs


【解决方案1】:

mongoose find 方法是异步的,res.render 可能/将在数组被填充之前执行。您的代码应如下所示

  app.get("/", (req, res) => {
      const items = [];

      Task.find({}, (err, tasks) => {
          if (err) {
              console.log(err);
          } else {
              tasks.forEach((task) => {
                  items.push(task.name);
                  //console.log(task.name) still works
              });
          }
          today = date.getDate();
          res.render('list', { kindOfDay: today, items: items });
      });
  }) 

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2017-12-23
    • 1970-01-01
    • 2020-06-23
    • 2020-05-06
    • 2019-10-21
    • 2020-07-09
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多