Sequelize中的Async getter / setter作为属性的一部分

时间:2018-06-01 10:35:17

标签: javascript promise async-await sequelize.js

我可以在Sequelize中将属性的getter定义为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 '';
        }
    }
},
...

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

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

如何在不使用异步函数的情况下实现此目的?

1 个答案:

答案 0 :(得分:5)

根据documentation getter和setter不支持任何形式的异步。它们是同步的。所以没有办法使用异步函数(因为我们需要一个promise支持)。

这里还有一个thread,讨论了这个问题。并且已确认将来会添加此功能

您可以改为扩展模型并添加实例级方法。该文档将其称为virtual getter。请参阅this article

您也可以将其设为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 '';
    }
}