续集协会

时间:2017-01-15 15:21:41

标签: node.js typescript sequelize.js

我正在开发一个Typescript Sequelize项目,我的/models/index.ts文件包含以下内容"导入此目录中的所有模型"功能:

var basename = path.basename(module.filename);
fs
    .readdirSync(__dirname)
    .filter(function (file) {
        return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
    })
    .forEach(function (file) {
        console.log(file);
        var model = sequelize['import'](path.join(__dirname, file));
        console.log('here');
        // NOTE: you have to change from the original property notation to
        // index notation or tsc will complain about undefined property.
        db[model['name']] = model;
    });

然后,我的模型结构如下/models/user.ts

export default function defineUser(sequelize: Sequelize.Sequelize, DataTypes) {
  var User = sequelize.define<UserInstance, UserAttributes>('User', {
    email: {
      type: Sequelize.STRING,
      unique: true,
      validate: { isEmail: true }
    },
    password: Sequelize.STRING
  });
  return User;
};

但是,我无法将模型从一个文件导入到另一个文件中,无法执行以下操作:

import * as User from './user'
// ... 
// definition of job model
// ...
Job.hasOne(User);

当我得到Argument of type 'typeof "~/models/job-response"' is not assignable to parameter of type 'Model<any, any>'.然后:

  

〜/ node_modules \ sequelize \ lib中\协会\ mixin.js:95   [1]抛出新的错误(this.name +&#39;。&#39; + Utils.lowercaseFirst(Type.toString())+&#39;调用某些“不是”的实例Sequelize.Model&#39);   [1] ^   [1]   [1]错误:Job.function(srcModel,targetModel,options){   [1] Association.call(this);   [1]   [1]}调用的东西不是Sequelize.Model的实例   [1]在Model.hasOne(〜\ node_modules \ sequelize \ lib \ associations \ mixin.js:95:13)

我应该如何访问模型实例,以便将其传递给hasMany()hasOne()函数。

1 个答案:

答案 0 :(得分:0)

模型注册循环运行后,所有模型都将在db.models上显示,并按名称键入。因此,您可以在同一个文件中或单独的文件中执行以下操作:

db.models.Job.hasOne(db.models.User)

我在单独的文件中找到定义关系很方便,因为如果你想定义关系的两面(即belongsTo / hasMany),那么你必须这样做(以避免循环依赖)