首页 > 解决方案 > 猫鼬模式病毒和异步等待

问题描述

我正在尝试从 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 时它不等待执行。

对此的任何帮助都将非常有帮助并非常感谢。

标签: node.jsexpressmongooseasync-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')已删除


推荐阅读