node.js - 猫鼬模式病毒和异步等待
问题描述
我正在尝试从 mongoose 获取一个值,并通过使用虚拟方法和虚拟字段将其添加到架构文档中,如下所示,
const sourceSchema = require('../source/schema.js').schema;
var Source = mongoose.model('Source', sourceSchema);
const schema = new Schema({
sourceId: {
type: Schema.Types.ObjectId,
required: true
},
description: {
type: String,
required: true
},
resources: {
type: Object
},
createdDate: {
type: Date
}
}
},
{
versionKey: false,
virtuals: true
});
schema.virtual('displayName').get(function () {
return this.getDisplayName();
});
schema.method('getDisplayName', async function () {
var source = await Source.findById(this.id);
if(source) {
var displaySource = JSON.parse(source['data']);
console.log(displaySource['displayName']);
return displaySource['displayName'];
}
});
但它总是空的,而它在控制台中打印值,它从不等待执行完成。我不确定为什么在我使用 await 时它不等待执行。
对此的任何帮助都将非常有帮助并非常感谢。
解决方案
Getter 和 Setter 不能异步,这就是 JS 的本质。
你从来没有打过回调
schema.method('getDisplayName', async function (cb) { // <-- added callback
var source = await Source.findById(this.id);
if(source) {
var displaySource = JSON.parse(source['data']);
console.log(displaySource['displayName']);
cb(displaySource['displayName']) // <-- called callback
} else cb(null)
});
然后在代码的某个地方
Schema.findOne(function (err, schema) {
schema.getDisplayName(function (displayName) {
// got it here
})
})
请注意schema.virtual('displayName')
已删除
推荐阅读
- amazon-web-services - 跨账户 S3 存储桶权限
- opengl-es - 使用 OpenGL ES 2.0 的 Aspect Fit 和 Aspect Fill 内容模式
- jenkins - 作为容器 kubernetes 运行的 Jenkins 上永久节点的持久性
- python - Python - MemoryError:无法分配类型为 int64 的数组
- python - 基于没有 JS 的单个 html 输入的自定义 url
- firebase - Firebase 模拟器:在函数中使用 PubSub
- android - 未找到 Espresso 测试课程
- php - PHP stdClass 和对象 foreach
- android - 搜索视图抛出异常(空对象引用)
- r - R stringr:str_match忽略表达式之间的文本