node.js - Node + Express - 在渲染之前获取 dbData

标签 node.js express async-await

我正在尝试使用从本地数据库获取的数据表来渲染 View 。查询和所有数据都以我想要的格式检查。但在获取数据之前,渲染 View ,并且我收到错误。

这是我的route.js,我希望在其中找到错误。

exports.getIndex = (req, res) {
  const result = sqldb.GetSubscribers()
  try{
      res.render('subscribtions/index', {
        moment: moment,
        subs : result,
        pageTitle: 'Subscribtions',
        path: '/subscribtions'
        })
      }
  catch(error)
      {
        console.log(error)
        res.redirect(404, '../views/404.ejs');
      }
}; 

DBcall 只是为了定位

exports.GetSubscribers = function() {
    const connString = "ConnectionString";

    query = "Some Long Query" 

    sql.open(connString, (err, con) => {
        if (err) {
        console.log('failed to open ' + err.message)
        }
        con.prepare(query, (err, ps) => {
            if (err) {
                console.log('Fejl - prepare: '+err.message)
                return
            }
            con.query(query, (err, rows) => {
                if (err) {
                    console.log('Fejl - query: '+ err.message)
                    return err;
                }
                console.log("Returning results...")
                return rows;
            })
        })
    })
}

到目前为止,我一直在尝试弄清楚如何使用 async/await 或 Promise,但没有任何运气。 你们中的任何一位聪明人都可以为我指明正确的方向吗?

最佳答案

原因可能是数据库调用是异步的,并且由于您不等待它,它将在完全获取数据之前返回呈现的 View 。

因此您需要等待对数据库的调用。假设该函数是可等待的:

exports.getIndex = async (req, res) => {
  ...
  try {
     const result = await sqldb.GetSubscribers();
  }
  catch(err) {
     console.log('Error getting subscribers', err);
  }
  ...
};

或者,如果该函数是 then-able:

exports.getIndex = (req, res) => {
  return sqldb.GetSubscribers().then(result => 
    res.render('subscribtions/index', {
      moment: moment,
      subs : result,
      pageTitle: 'Subscribtions',
      path: '/subscribtions'
    })
  .catch(error => {
    console.log(error);
    res.redirect(404, '../views/404.ejs');
  }));
}

要使 GetSubscribers 函数返回 promise :

exports.GetSubscribers = () => {
  const connString = 'ConnectionString';

  query = 'Some Long Query';

  return new Promise((resolve, reject) => {
    sql.open(connString, (err, con) => {
      if (err) {
        console.log(`failed to open ${err.message}`);
      }
      con.prepare(query, (err, ps) => {
        if (err) {
          console.log(`Fejl - prepare: ${err.message}`);
          reject();
        }
        con.query(query, (err, rows) => {
          if (err) {
            console.log(`Fejl - query: ${err.message}`);
            reject(err);
          }
          console.log('Returning results...');
          resolve(rows);
        });
      });
    });
  });
};

关于node.js - Node + Express - 在渲染之前获取 dbData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508522/

相关文章:

c# - XElement 在 C# 中使用 async/await 保存文件

javascript - 数组过滤器(mongodb)在我的nodejs后端不起作用

node.js - 试图使用 supertest 来检查响应的主体 - 得到一个错误

javascript - 'await' 对此表达式的类型没有影响

javascript - 模块导出返回我一个函数

node.js - 如何在 Mongoose 中更新数组值

c# - 为什么在线程中运行异步操作比纯任务或纯线程操作慢得多

node.js - 更新具有数组和对象键的嵌套对象是动态的

javascript - REST API 新用户未发布到 MongoDB

javascript - Heroku:将 Node 更新到最新版本