【问题标题】:SequelizeAssociationError after second call第二次调用后的 SequelizeAssociationError
【发布时间】:2019-11-14 18:17:11
【问题描述】:

我正在使用 NodeJS 网络服务来接收我的数据库数据。如果我第一次调用方法,一切都会按预期工作。

我想从我的表中接收所有与以下代码相关的条目:

    model.hasOne(devicemodel, {foreignKey: 'id',sourceKey:'deviceid'});
    model.hasOne(usermodel, {as: 'client', foreignKey: 'id' ,sourceKey: 'clientid'});
    model.hasOne(usermodel, {as: 'operator', foreignKey: 'id' ,sourceKey: 'operatorid'});


    var rma = await model.findAll({
        include: [devicemodel, {model: usermodel, as: 'client'}, {model: usermodel, as: 'operator'}],
        where: {
            itoakid: config.companyid
        }
    });
    return callback(rma);

但在第二次调用时,我收到以下错误:

SequelizeAssociationError:您在两个单独的关联中使用了别名客户端。别名关联必须具有唯一的别名。

我正在使用 Sequelize 版本 6.11.3

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    如果您需要在路由中定义关联,您可以在定义之前检查现有关联。

    另一种方式,

    
        model.hasOne(devicemodel, {foreignKey: 'id',sourceKey:'deviceid'});
        if( !model.hasAlias('client') ){
            model.hasOne(usermodel, {as: 'client', foreignKey: 'id' ,sourceKey: 'clientid'});
        }
        if(!model.hasAlias('operator')){
            model.hasOne(usermodel, {as: 'operator', foreignKey: 'id' ,sourceKey: 'operatorid'});
        }
    
    
        var rma = await model.findAll({
            include: [devicemodel, {model: usermodel, as: 'client'}, {model: usermodel, as: 'operator'}],
            where: {
                itoakid: config.companyid
            }
        });
        return callback(rma);
    
    

    最好的方法,你应该像提到的@Samuel G 那样定义关联一次

    【讨论】:

      【解决方案2】:

      您正在定义关联每次路由被命中并且您的函数执行。

      将架构声明移出路由处理程序并在定义架构后将其放置:

                      class Model extends Sequelize.Model {}
      
                      Model.init({
                          id: {
                              primaryKey: true,
                              type: Sequelize.UUID
                          },
                          ...
                      }, {
                          sequelize,
                          modelName: 'model'
                      });
      
                     sequelize.models.model.hasOne(...
      

      在您的路由处理程序中:

                     var rma = await sequelize.models.model.findAll({
                        include: [devicemodel, {model: sequelize.models.usermodel, as: 'client'},
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多