【发布时间】: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