在单独的文件夹中分离续集模型并将它们连接在一起

Separate sequelize models in separate folders and join all together

我有一项复杂的任务要做。我需要将我的 sequelize 模型分离到 models 文件夹中的单独文件夹中,就像这样的结构:

├── node_modules
├── src
|    └── models
|        ├──settings
|        |  ├── user.js
|        |  └── location.js
|        ├──stock
|        |  ├── stock.js
|        |  └── products.js
|        └── index.js


今天,我将所有模型和 index.js 一起放在模型根文件夹中,这样我就可以从控制器调用每个模型

const { users, stock } = require("../../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 envConfigs = require("../config/config")
const config = envConfigs[env]
const db = {}

let sequelize
if (config.url) {
  sequelize = new Sequelize(config.url, 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
    )
    db[model.name] = model
  })

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

db.sequelize = sequelize

module.exports = db

这是使用 sequelize-cli 自动创建的。

我认为我需要在 index.js 中进行一些搜索,并将文件夹和文件连接到 index.js 中的模型变量中,这样我就可以使用像“model.settings.user 这样的模型" 进行关联或调用控制器中的对象。

我终于让 index.js 正常工作了!这是任何需要它的代码(在 index.js 中有此代码,它将在所有文件夹中搜索并将所有模型名称文件放入 const "model"

"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 envConfigs = require("../config/config")
const config = envConfigs[env]
const db = {}

let sequelize
if (config.url) {
  sequelize = new Sequelize(config.url, config)
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  )
}

const files = []
const sortDir = (maniDir) => {
  const folders = []
  const CheckFile = (filePath) => fs.statSync(filePath).isFile()
  const sortPath = (dir) => {
    fs.readdirSync(dir)
      .filter((file) => file.indexOf(".") !== 0 && file !== "index.js")
      .forEach((res) => {
        const filePath = path.join(dir, res)
        if (CheckFile(filePath)) {
          files.push(filePath)
        } else {
          folders.push(filePath)
        }
      })
  }
  folders.push(maniDir)
  let i = 0
  do {
    sortPath(folders[i])
    i += 1
  } while (i < folders.length)
}
sortDir(__dirname)

files.forEach((file) => {
  const model = require(file)(sequelize, Sequelize.DataTypes)
  db[model.name] = model
})

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

db.sequelize = sequelize

module.exports = db