如何确保在 Node JS 上的 render() 之前执行查询

Posted

技术标签:

【中文标题】如何确保在 Node JS 上的 render() 之前执行查询【英文标题】:How to make sure the query executed before render() on Node JS 【发布时间】:2019-02-21 00:24:20 【问题描述】:

不知道是不是异步问题,所以有时候结果没有产品数据,只有类型数据。但是,有时它会有两个数据。

我的设置: Node JS、Express、Mongoose

router.get('/', function (req, res, next) 
var data = ;
Product.find().limit(4).populate(path: 'region_id', model: Region)
    .then(function (doc) 
        data.product = doc;
    );
Type.find()
    .then(function (doc) 
        data.type = doc;
    );

res.render('index', title: 'Home', items: data);
);

如果我是正确的,那么如何确保在运行 render() 之前执行所有 find() 函数。

谢谢!

【问题讨论】:

【参考方案1】:

因为两个异步操作都返回Promises,所以您应该使用Promise.all,这将在两者都完成时解决。不需要外部的 data 对象,只需直接使用已解析承诺的值即可。另外,在使用 Promises 时不要忘记使用 catch 处理错误:

router.get('/', function (req, res, next) 
  Promise.all([
    Product.find().limit(4).populate(path: 'region_id', model: Region),
    Type.find()
  ])
    .then(([product, type]) => 
      res.render('index', title: 'Home', items:  product, type  );
    );
    .catch((err) => 
      // handle errors
    );
);

【讨论】:

非常感谢!

以上是关于如何确保在 Node JS 上的 render() 之前执行查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行 Node.js 应用程序之前确保 MySQL 数据库存在

在 Node.js/Express 中,如何自动将此标头添加到每个“渲染”响应中?

Node.js在发送标题后无法设置标题引入res.render()后出错

在 Node.js 中使用 express-jwt 令牌保护非 api (res.render) 路由

如何确保 Node.js 中的这些函数链按顺序执行(使用 Promise)?

res.render() 不渲染 ejs 文件,没有抛出错误 node.js app