首页 > 解决方案 > 为什么所有 Sequelize 示例模型都用 Model(sequelize, Sequelize) 实例化?

问题描述

查看此Sequelize 教程中的 models/blog.js 定义。

module.exports = (sequelize, type) => {
    return sequelize.define('blog', {
        id: {
          type: type.INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        text: type.STRING
    })
}

它被这样调用:

const BlogModel = require('./models/blog');
const sequelize = new Sequelize('codementor', 'root', 'root', {...});
const Blog = BlogModel(sequelize, Sequelize);

我搜索了更多 Sequelize 示例,并在其中至少 90% 中找到了Model(sequelize, Sequelize) “模式”。几乎所有这些都直接或间接地从一些非常糟糕的代码示例中派生出来,因为......

这对我来说真的很难看。有两个变量仅按大小写进行区分。其中一个是 Sequelize 库,另一个是会话或连接(不确定 Sequelize 使用哪个术语)。我认为有大写变量是违反编码准则的。接下来,一个库引用被传递到另一个文件中,这在 Node 中应该是完全没有必要的,因为需要模块在第一次加载时被缓存。那么为什么不直接在模型文件中引用 Sequelize 并且只传递sequelize对象呢?

有人认为这样做有什么好的理由吗?这个SO post中描述了一种 IMO 更清洁的方法。向回答者致敬。我只是想知道我是否在这里遗漏了一些明显的东西,我真的应该这样做,或者我是否可以自由地编写一些更干净的代码?

标签: mysqlnode.jssequelize.js

解决方案


那真的很丑。我所做的是在它自己的文件中创建一个数据库并将其导出。

const db = new Sequelize(
  process.env.DATABASE_URL || `postgres://localhost:5432/${databaseName}`,
)

module.exports = db

在 blog.js 文件中,我将导入它并执行以下操作:

const Sequelize = require('sequelize')
const db = require('../db')

const blog = db.define('blog', {
  your_field_name_here: {
    type: your_sequelize_type_here
  },
  ... and so on
})

module.exports = blog

不完全确定他们为什么这样做,但我发现以这种方式定义模型更加清晰,它应该可以实现您想要实现的目标。Sequelize 文档中有一些过时的东西,所以如果这就是过去的样子,我不会感到惊讶。


推荐阅读