Sequelize中的异步获取器/设置器作为属性的一部分

lel*_*ood 3 javascript promise async-await sequelize.js

我可以在Sequelize中将属性的获取器定义为asyc函数吗?
在getter中,我应该从另一个表中检索一个值,并且我已经在模型定义中尝试过此操作:

...
bio: {
    type: Sequelize.STRING,
    get: async function() {
        let bio = this.getDataValue('bio');
        if (bio) {
            let bestFriend = await db.models.User.findById(this.getDataValue('BestFriendId'))
            if(bestFriend){
                bio += ` Best friend: ${bestFriend.name}.`;
            }
            console.log(bio)
            return bio;
        } else {
            return '';
        }
    }
},
...
Run Code Online (Sandbox Code Playgroud)

记录我可以通过以下方式读取正确的简历:
Born yesterday. Love to read Best friend: Markus

但是我检索的对象的bio属性中有一个空对象。
我想那是因为不支持异步功能,我错了吗?

在不使用异步功能的情况下如何实现?

Ant*_*ich 8

根据文档, getter和setter不支持任何形式的异步。它们是同步的。因此,无法使用异步功能(因为我们需要Promise支持)。

而且,这里是一个线程对这个话题的讨论。而且它证实了此功能打算在将来增加。

您可以改为扩展模型并添加实例级别方法。该文档将其称为virtual getter。请看这篇文章

您也可以制作它async并访问模型数据。

BioModel.prototype.getBio = async function() {
    let bio = this.getDataValue('bio');
    if (bio) {
        let bestFriend = await db.models.User.findById(this.getDataValue('BestFriendId'))
        if(bestFriend){
            bio += ` Best friend: ${bestFriend.name}.`;
        }
        return bio;
    } else {
        return '';
    }
}
Run Code Online (Sandbox Code Playgroud)