Async getter / setter в Sequelize как часть свойства - PullRequest
0 голосов
/ 01 июня 2018

Могу ли я определить получатель свойства как асинхронную функцию в Sequelize?
В получателе я должен получить значение из другой таблицы, и я попробовал это в определении модели:

...
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

Но у объекта, который я извлекаю, есть пустой объект в атрибуте био.
Я полагаю, это потому, что асинхронная функцияне поддерживается, я не прав?

Как этого добиться без использования асинхронной функции?

1 Ответ

0 голосов
/ 01 июня 2018

Согласно документации геттеры и сеттеры не поддерживают какую-либо форму асинхронности.Они синхронизированы.Поэтому нет возможности использовать асинхронные функции (поскольку нам нужна поддержка обещаний).

Также здесь есть нить с обсуждением этой темы.И подтверждено, что эта функция не будет добавлена ​​в будущем.

Вместо этого можно расширить модель и добавить метод уровня экземпляра.Док называет это 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 '';
    }
}
...