如何确保在 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】:因为两个异步操作都返回Promise
s,所以您应该使用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) 路由