Node.js 在NodeJS中继续加载模型

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

我目前正在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       = 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'结尾
然后将每个模型文件键入exports对象,行
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