Node.js 在NodeJS中继续加载模型
我目前正在Scotch.io上使用NodeJS、Express、PostgreSQL和Sequelize进行学习,然后我发现:Node.js 在NodeJS中继续加载模型,node.js,sequelize.js,Node.js,Sequelize.js,我目前正在Scotch.io上使用NodeJS、Express、PostgreSQL和Sequelize进行学习,然后我发现: 'use strict'; var fs = require('fs'); var path = require('path'); var Sequelize = require('sequelize'); var basename = path.basename(module.filename); var env = proce
'use strict';
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
var env = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/config.json')[env];
var db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(config.database, config.username, config.password, config);
}
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;
module.exports = db;
我正在寻求一个简单的解释这个代码。这里到底发生了什么
如果未设置节点环境,我确实理解默认为
开发
的部分,但我需要澄清文件读取部分,即fs
开始的部分。首先,请注意,此代码由sequelize cli
通过运行sequelize init
生成,并放置在index.js
文件中,该文件位于models/
文件夹中
1。配置环境
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(config.database, config.username, config.password, config);
}
这有助于在生产中使用。作为示例,我将向您展示我的代码:
module.exports = {
development: {
dialect: 'postgres',
username: '<username name>',
password: 'test',
database: '<db name>',
host: 'localhost'
},
production: {
dialect: 'postgres',
dialectOptions: {
ssl: true
},
protocol: 'postgres',
use_env_variable: 'DATABASE_URL'
}
}
fs.readdirSync
同步读取其参数中给定的目录。在本例中,它是\uuu dirname
,这是index.js文件所在的目录。在这里,您在models/
目录中定义的模型被拉入。请注意,filter函数只是确保:
- 有文件要读
- 它不包括这个文件(即不是index.js)
- 它们以'.js'结尾
db[model.name]=model代码>
3。关联每个模型
Object.keys(db).forEach(function(modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
最后,一旦获得了所有模型文件(从上一次读取中),我们将运行每个模型的associate
函数(如果存在)。此方法在每个模型文件中定义如下:
module.exports = (sequelize, DataTypes) => {
var Model1 = sequelize.define('Model1',
{ ... })
// Class Method
Model1.associate = function (models) {
Model1.belongsTo(models.Model2)
}
return Model1
}
4。导出使用
sequelize数据库的实例(sequelize
)和sequelize
库的实例都将导出
通过这种方式,我们现在可以执行以下操作:
假设目录结构为
- 模型/
- index.js
- model1.js
- model2.js
require('./models')。Model1//访问您的模型
这是导入和使用模型的方式,而不是直接通过模型的定义文件。这可确保它们正确同步和关联
同样,我们可以访问sequelize:
require('./models')
.sequelize.sync({ force: true }) // access to your sequelize db
简单地说,这是从与此文件相同的目录导入所有.js
文件。这是通过sequelize['import']
方法完成的
此外,假设所有这些文件都包含sequelize模型,因为导入的返回值映射到名为db
的字典上
db[model.name] = model
导入所有文件并将模型映射到db
后,仅当模型包含associate方法时,才会运行一个循环来调用每个模型上的associate
。通常使用关联方法来定义模型之间的所有关联,即hasMany
,hasOne
,belongsTo
等。Wow!非常感谢你的解释。现在清楚多了。还有一件事,这行是做什么的:var basename=path.basename(module.filename);?我相信它只是将文件名从路径中删除。如果你愿意的话,可以查看一下关于它的讨论。Ie我相信返回的是index.js
(假设文件名为index.js)。非常感谢你!你的回答真的很有帮助。太好了,很乐意帮忙!伟大的谢谢。您的config.json
是否在.gitignore
中?@keshavAggarwal否-签入.config.json
是安全的。如果您不想公开开发凭据,那么使用环境变量。使用的通用包是。您应该忽略.env
文件。
db[model.name] = model