【问题标题】:Attach Model to Sequelize Object将模型附加到 Sequelize 对象
【发布时间】:2020-11-30 05:07:35
【问题描述】:

自从我使用 sequelize 已经有一段时间了,我最近开始使用 sequelize-cli 工具进行新设置,该工具似乎具有非常模板化的模型生成方法,我正在尝试确定如何访问我的模型以进行查询。在下面的尝试中,我起初以为我错误地访问了模型对象,但是当我控制台记录 sequelize 对象时,我注意到 Model 属性带有一个空对象。这在技术上是模型参考的来源吗?除了从 cli 初始化和以相同方式生成模型之外,我还应该调整其他什么吗?

在我的 API 调用中记录 sequelize 对象:

import db from '../../models/index';

console.log(db) 正如您在下面看到的那样,models: {} 是空的,据我所知,应该使用在 users.js 中定义的 users 模型进行填充

{
  sequelize: Sequelize {
    options: {
        ...
    },
    config: {
      ...
    },
    dialect: PostgresDialect {
      ...
    },
    queryInterface: PostgresQueryInterface {
      sequelize: [Circular],
      queryGenerator: [PostgresQueryGenerator]
    },
    models: {},
    modelManager: ModelManager { models: [], sequelize: [Circular] },
    connectionManager: ConnectionManager {
      ...
    }
  }, ...

这是由 cli 生成的 index.js(希望能解释一下它应该如何自动识别模型):

/models/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const { Sequelize } = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/sequelize.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    console.log(db[model.name])
    db[model.name] = model;
  });

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

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

/models/users.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class users extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  users.init({
    id: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4
    },
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    password: DataTypes.STRING,
    email: DataTypes.STRING,
    active: DataTypes.BOOLEAN,
    deleted: DataTypes.BOOLEAN
  }, {
    sequelize,
    modelName: 'users',
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    deletedAt: 'deleted_at',
    paranoid: true,
    underscored: true,
    define: {
      freezeTableName: true,
      tableName: 'users'
    }
  });
  return users;
};

【问题讨论】:

  • 检查是否可以到达forEachreaddirSync的处理程序
  • 它没有。它到达.filter,它返回一个布尔响应 21 次,其中 6 = false 和 15 = true
  • 尝试将readdirSync(__dirname) 输出到控制台并将结果添加到您的帖子中
  • 有意思,好像是在同步我电脑的根目录? [...,'etc', 'home', 'opt', 'private', 'sbin', 'tmp', 'usr', 'var']
  • console.log(__dirname) 返回/

标签: sequelize.js sequelize-cli


【解决方案1】:

看来initmodelsequelize-cli 生成器并不总是能按预期适应应用环境。创建的样板文件存在三个问题。

  1. fs.readdirSync(__dirname) 正在同步我计算机上的父目录,而不是我的应用程序目录
  2. const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); 遇到同样的问题,应该是在你的模型目录中加载 js 文件
  3. 模型生成器中缺少const Sequelize = require('sequelize');users.jsconst model = require(...)(sequelize, Sequelize.DataTypes); 中引用。没有它会抛出 Sequelize 缺失的错误

这是正确的代码:

我使用process.cwd() 并附加了'/models/' 来更正文件夹位置问题。

index.js(代码更新部分):

fs
  .readdirSync(process.cwd() + '/models/') // Updated
  .filter(file => {
    console.log(file)
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    console.log('file + Sequelize')
    console.log(Sequelize);
    const model = require('.' + path.join(__dirname, file))(sequelize, Sequelize.DataTypes); // Updated
    console.log(db[model.name])
    db[model.name] = model;
  });

users.js(代码更新部分):

'use strict';
const Sequelize = require('sequelize');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2020-11-04
    相关资源
    最近更新 更多