typescript - Sequelize 更新到 v4 抛出错误 : models. 用户似乎是一个函数

标签 typescript sequelize.js

我最近将 Sequelize ORM 从 v3 更新到 v4。我已遵循升级指南,但仍面临问题。我基于 express-example

这是 模型/index.ts :

export var db: DbConnection = {};
export var sequelize = new Sequelize(process.env.DB_CONNECTION_STRING);
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) {
        var model = sequelize['import'](path.join(__dirname, file));
        db[model['name']] = model;
    });

Object.keys(db).forEach(function (modelName) {
    if (db[modelName].associate) {
        db[modelName].associate(db);
    }
});

db['sequelize'] = sequelize; db['Sequelize'] = Sequelize;

export default <DbConnection>db;

这是 模型/user.ts :
export default function defineUser(sequelize: Sequelize.Sequelize, DataTypes) {
  var User = sequelize.define<UserInstance, UserAttributes>('User', {
    email: {
      type: DataTypes.STRING,
      unique: true,
      validate: { isEmail: true }
    },
    password: DataTypes.STRING,
    role: {
      type: DataTypes.ENUM,
      values: ['Admin', 'Operator', 'Member']
    }
  });

  User.beforeCreate(function (user: UserInstance, options) {
    return hashPassword(user.password).then(function (hashedPw) {
      user.password = hashedPw;
    });
  })
  return User;
};

function hashPassword(password: string): Promise<string> {
  return new Promise(function (resolve, reject) {
    bcrypt.genSalt(5, function (err, salt) {
      if (err) { reject(err); }

      bcrypt.hash(password, salt, null, function (err, hash) {
        if (err) { reject(err); }
        resolve(hash);
      })
    });
  })
};

但是,我仍然收到错误:

Unhandled rejection Error: models.User appears to be a function. Perhaps you are importing model factory function? You should then use sequelize.import to create your model, see https://github.com/sequelize/express-example/blob/master/models/index.js#L17 at Loader.loadFixture (C:\Users\George\Source\Repos\myProj\node_modules\sequelize-testing-fixtures\lib\loader.js:39:15)



我究竟做错了什么?

更新:

我也试过 module.exports = function defineUser(... ,但这也不起作用。

最佳答案

您可能想要修复电子邮件和密码的数据类型。您也可能使用 module.export 而不是函数。

email: {
  type: Sequelize.STRING, //change to DataTypes.STRING
  unique: true,
  validate: { isEmail: true }
},
password: Sequelize.STRING, //change to DataTypes.STRING
role: {
  type: DataTypes.ENUM,
  values: ['Admin', 'Operator', 'Member']
}

关于typescript - Sequelize 更新到 v4 抛出错误 : models. 用户似乎是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45593425/

相关文章:

node.js - 在客户端和服务器 Mongoose 模型之间共享 typescript 接口(interface)

typescript - 多层式防护罩

javascript - 解析数组内容

javascript - Angular 6 中的 xml2js : Can't resolve 'stream' and 'timers'

node.js - 尝试访问小写 "users"而不是大写 "Users"的表名的 Sequelize 模型类

javascript - Typescript:将*一些*(不是全部)属性从一个类实例复制到另一个对象的最佳方法是什么?

node.js - 关联模型中的 SequelizeEagerLoadingError

node.js - 如何扩展Sequelize (v5) 的数据类型?

node.js - Sequelize DataTypes.STRING 的意外标记

mysql - 在 NodeJS 中 Sequelize : Inner JOIN implementation Failure