sequelize getter 方法中的异步表查询

Posted

技术标签:

【中文标题】sequelize getter 方法中的异步表查询【英文标题】:Async table query in sequelize getter method 【发布时间】:2016-12-02 19:35:45 【问题描述】:

我有一个执行数据库查询的 sequelize 实例方法:

getPropertyDays() 
    const queryString = `
      SELECT
        state
      FROM property_days
      WHERE
        DATE(day) = CURDATE() AND
        property_id = :propertyId;`;

    const replacements = propertyId: this.id;
    return this.sequelize.query(queryString, replacements: replacements, type: sequelize.QueryTypes.SELECT);
  ,

被 getter 调用:

getterMethods: 
  propertyState() 
    var self = this;
    const blockedDay = 'x';
    const unavailableDay = 'u';

    this.getPropertyDays().then(function(result) 
      var state = result[0]['state'];

      if (self.prospect || state == unavailableDay) 
        return 'unavailable';
      
      if (state == blockedDay) 
        return 'occupied';
      
      else 
        return 'available';
      
    );
  
,

问题是从 getter 返回的结果是未定义的,因为他无法在返回之前解决 promise。

由于我没有桌子的模型,我该如何解决这个问题?已经玩了一天了!

非常感谢。

【问题讨论】:

【参考方案1】:

不会返回从this.getPropertyDays 返回的承诺吗?

getterMethods: 
  propertyState() 
    var self = this;
    const blockedDay = 'x';
    const unavailableDay = 'u';

    return this.getPropertyDays().then(function(result) 
      var state = result[0]['state'];

      if (self.prospect || state == unavailableDay) 
        return 'unavailable';
      
      if (state == blockedDay) 
        return 'occupied';
      
      else 
        return 'available';
      
    );
  
,

【讨论】:

不是我的实验。例如,模型的 toJSON 将输出 promise 的属性与 promise 的解析值,这并不是很有帮助。

以上是关于sequelize getter 方法中的异步表查询的主要内容,如果未能解决你的问题,请参考以下文章

sequelize getter 和 setter 是如何工作的?

nodejs sequelize连接字符串中的异步等待问题

如何从 getter 或 setter 调用异步方法?

sequelize.transaction() 可以将异步函数作为回调吗?

在nodejs sequelize中循环获取异步数据

异步api调用后如何使用vuex getter