2017-04-11 14 views
0

私は 'services'フォルダの下に2つのフォルダを持っています。彼らはサービスを個別に呼び出す作業をしています。今、私は関連するモデルを含めるために1つのモデルを展開する必要があります。 'info:TypeError:プロパティを読み取ることができません'未定義のモデル 'feathersjs/sequelizejs - > MODELはMODELに関連付けられていません

データベースは存在し、SQLサーバーもリレーションもあります。

ファイルサービス

'use strict'; 

const service = require('feathers-sequelize'); 
const activity = require('./activity-model'); 
const hooks = require('./hooks/index'); 

module.exports = function() { 
    const app = this; 

    const options = { 
     Model: activity(app.get('mic_sequelize')) 
    }; 

    app.use('/mic/activity', service(options)); 

    const activityService = app.service('/mic/activity'); 

    activityService.before(hooks.before); 
    activityService.after(hooks.after); 
}; 

ファイルサービスindex.js \マイク\活動\ \マイク\活動\アクティビティ-model.js

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const activity = sequelize.define('activity', { 
     activity_pk: { 
      type: Sequelize.INTEGER, 
      primaryKey: true, 
      autoIncrement: true, 
      allowNull: false, 
      unique: true 
     }, 
     activity_plan_pk: { 
      type: Sequelize.INTEGER, 
      allowNull: false, 
      unique: false 
     }, 
     change_order_pk: { 
      type: Sequelize.INTEGER, 
      allowNull: true, 
      unique: false 
     }, 
     description: { 
      type: Sequelize.STRING(255), 
      allowNull: false, 
      unique: false 
     }, 
     id: { 
      type: Sequelize.STRING(255), 
      allowNull: false, 
      unique: true 
     } 
    }, { 
     freezeTableName: true, 
     paranoid: false, 
     timestamps : false, 
     underscored : false, 
     tableName: 'Activity', 
     classMethods: { 
      associate() { 
       activity.belongsTo(sequelize.models.activity_plan, { 
        allowNull: true, 
        as: 'activity_plan' 
       }); 
       activity.belongsTo(sequelize.models.change_order, { 
        allowNull: false, 
        as: 'change_order' 
       }); 
      } 
     } 
    }); 

    return activity; 
}; 

ファイルサービス\マイク\アクティビティ\指数\フック.jsファイル

'use strict'; 

const globalHooks = require('../../../../hooks'); 
const hooks = require('feathers-hooks'); 
const auth = require('feathers-authentication').hooks; 

exports.before = { 
    all: [], 
    find: [ 
     getRelatedInfo() 
    ], 
    get: [ 
     getRelatedInfo() 
    ], 
    create: [], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

exports.after = { 
    all: [], 
    find: [], 
    get: [], 
    create: [], 
    update: [], 
    patch: [], 
    remove: [] 
}; 


function getRelatedInfo() { 
    return function (hook) { 
     hook.params.sequelize = { 
      attributes: [ 
       'activity_pk', 
       'activity_plan_pk', 
       'change_order_pk', 
       ['description', 'activity_description'], 
       ['id', 'activity_id'] 
      ], 
      include: [ 
       { 
        model: hook.app.services.activity_plan.Model, 
        as: 'activity_plan', 
        required: false, 
        attributes: [ 
         ['description', 'activity_plan_description'], 
         ['id', 'activity_plan_id'] 
        ] 
       } 
      ] 
     } 
    }; 
    return Promise.resolve(hook); 
} 

ファイルサービス\マイク\ activity_plan \ index.js

'use strict'; 

const service = require('feathers-sequelize'); 
const activity_plan = require('./activity_plan-model'); 
const hooks = require('./hooks/index'); 

module.exports = function() { 
    const app = this; 

    const options = { 
     Model: activity_plan(app.get('mic_sequelize')) 
    }; 

    app.use('/mic/activity_plan', service(options)); 

    const activityplanService = app.service('/mic/activity_plan'); 

    activityplanService.before(hooks.before); 
    activityplanService.after(hooks.after); 
}; 

ファイルサービス\マイク\ activity_plan \ activity_plan-model.js

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const activity_plan = sequelize.define('activity_plan', { 
     activity_plan_pk: { 
      type: Sequelize.INTEGER, 
      primaryKey: true, 
      autoIncrement: true, 
      allowNull: false, 
      unique: true 
     }, 
     description: { 
      type: Sequelize.STRING(255), 
      allowNull: false, 
      unique: false 
     }, 
     id: { 
      type: Sequelize.STRING(255), 
      allowNull: false, 
      unique: true 
     } 
    }, { 
     freezeTableName: true, 
     paranoid: false, 
     timestamps : false, 
     underscored : false, 
     tableName: 'Activity_Plan', 
     classMethods: { 
      associate() { 
       activity_plan.hasMany(sequelize.models.activity, { 
        as: 'activity_plan', 
        foreignKey: 'activity_plan_pk', 
        targetKey: 'activity_plan_pk' 
       }); 
      } 
     } 
    }); 

    return activity_plan; 
}; 

ファイルサービス\マイク\ activity_plan \フック\ index.js

'use strict'; 

const globalHooks = require('../../../../hooks'); 
const hooks = require('feathers-hooks'); 
const auth = require('feathers-authentication').hooks; 

exports.before = { 
    all: [], 
    find: [], 
    get: [], 
    create: [], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

exports.after = { 
    all: [], 
    find: [], 
    get: [], 
    create: [], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

質問

私はどこかに誤った設定があると思う。私はサービスがサブフォルダを持たない私の自己の実用的なアプリケーションを使いました、そして、関係は同じように行われます。それは働いている。問題がどこにあるか?

オーケー解きます。そこで、ファイルの場所以外は変更せずに、activityとactivity_Planをサービスのルートに戻しました。同じエラー。その後、サービスのパスを変更しました( '/ mic'が削除されました)、 'activity_plan'は 'activity'に関連付けられていません。

さて、私はテストを元に戻し、この行をmodel: hook.app.service('/mic/activity_plan').Modelにしました。それから私は何かを考えました。私はカスタムプライマリキーを持っているので、hasManyで何かする必要があります。belongsToの部分を探してください。

だから、私は妙に同じ問題を後遺症(テーブル)で作る2番目のデータベースを作った。

at Model.validateIncludedElement (D:\Workspace\Projects\01. Live Customers\Mexon Technology\Projects - Mexon\MexonInControl\MultiFunctionalPortal\backend\node_modules\sequelize\lib\model.js:558:11)を見て、それが指し示すコードでは、私のコードにmodel: hook.app.service('/mfp/sys_metadata').Modelという行と組み合わされたモデルの命名に問題がある可能性があります。

答えて

0

おはようございます。サービスサブフォルダのindex.jsファイル内の関連付けを完全に忘れてしまった:

Object.keys(sequelize.models).forEach(function(modelName) { 
     if ("associate" in sequelize.models[modelName]) { 
      sequelize.models[modelName].associate(); 
     } 
    }); 

    sequelize.sync(
     { 
      force: false 
     } 
    ); 
関連する問題