解决猫鼬虚拟财产中的承诺?



我正在使用异步虚拟属性来计算该文档在特定其他集合中引用的频率。已添加此功能。

// Schema mortician.js
const Pickup = require('./pickup')
const mongoose = require('mongoose')
const mortSchema = mongoose.Schema({
name: {
type: String,
required: true
}
}, { timestamps: true })
mortSchema.virtual('count').get( async function () {
return await Pickup.countDocuments({ mortician: this._id })
})
module.exports = mongoose.model('Mortician', mortSchema)

但是,当我尝试像这样渲染它时,它会返回一个 Promise:Promise { <pending> }并且显示的值是[object Promise],就像 joseym 在这里描述的那样: 支持异步虚拟 #1894

async index(req, res) {
try {
const morticians = await Mortician.find({}).exec()
res.render('pages/morticians', {
title: 'Bestatter',
page: req.originalUrl,
morticians: morticians
})
} catch (err) { err => console.log(err) }
..
}

由于我直接传递入殓师元素进行渲染,因此我知道在哪里放置所需的await以进行mortician.count。我想避免循环(for (const mortician of morticians)(,然后再将其传递给res.render。如何解决这个问题?

在虚拟属性中查询("OtherSchema".find..(是否有意义?什么是最佳实践?

你需要执行你的承诺,然后将结果保存在一个变量中,该变量将用于渲染它

像这样的东西

async index(req, res) {
try {
const morticians = await Mortician.find({}).exec();
res.render('pages/morticians', {
title: 'Bestatter',
page: req.originalUrl,
morticians: morticians
})
} catch (err) {
err => console.log(err)
}
}

最新更新