【问题标题】:Express.js and MySQL model + validationExpress.js 和 MySQL 模型 + 验证
【发布时间】:2018-08-03 10:00:10
【问题描述】:

我正在使用 Node.js 和 Express 框架开发应用程序。我发现了很多使用 MongoDB 建模数据的示例,但我的项目需要 SQL 数据库。

谁能简单解释一下,基于 MySQL 制作模型的最佳方法是什么?

我还想知道如何提供这些模型的后续验证。也许我应该在它们中定义验证属性?

【问题讨论】:

    标签: mysql node.js validation express model


    【解决方案1】:

    没有最好的方法来制作基于 MySQL 的模型。您可以实现自己的方式来处理模型,但 Node.js 有许多可用的 ORM 模块,我建议使用其中之一。

    我使用Sequelize 作为 ORM 来定义模型并在几个 Express 应用程序中与数据库交互。我遇到的另一个 Node 的 ORM 是 Bookshelf.js,但还有很多其他的。使用哪一种取决于您的喜好和需要。

    编辑:使用示例

    在使用 Sequelize 模型时,我建议采用以下结构:项目中的一个名为 models 的目录,其中包含每个模型的文件和一个用于加载 Sequelize 环境的 index.js 文件。如果你使用Sequelize CLI,它也有几个遵循这个结构的方法。

    index.js

    const fs = require("fs");
    const path = require("path");
    const Sequelize = require("sequelize");
    let sqize = new Sequelize({
      host     : "1.2.3.4",
      port     : 1234,
      database : "testDb",
      username : "pino",
      password : "th1S1s@c0mpL3xP4sSw0rD",
      dialect: 'mysql',
    });
    
    fs.readdirSync(__dirname).filter(function(file) {
      return (file.indexOf(".") !== 0) && (file !== "index.js");
    }).forEach(function(file) {
      let model = sequelize.import(path.join(__dirname, file));
      db[model.name] = model;
    });
    
    Object.keys(db).forEach(function(modelName) {
      if ("associate" in db[modelName]) {
        db[modelName].associate(db);
      }
    });
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    db.op        = Sequelize.Op;
    
    module.exports = {
      sqize: sqize,
      Sequelize: Sequelize,
      op: Sequelize.Op
    };
    

    users.js

    module.exports = function (sequelize, DataTypes) {
      let users = sequelize.define('users', {
        username: {
          type: DataTypes.STRING(255),
          allowNull: true
        },
        firstname: {
          type: DataTypes.STRING(255),
          allowNull: true
        },
        secondname: {
          type: DataTypes.STRING(255),
          allowNull: true
        },
        email: {
          type: DataTypes.STRING(255),
          allowNull: true
        },
        type: {
          type: DataTypes.INTEGER(4),
          allowNull: true,
          references: {
            model: 'users_type',
            key: 'id'
          }
        },
        password: {
          type: DataTypes.STRING(255),
          allowNull: true
        },
        salt: {
          type: DataTypes.STRING(255),
          allowNull: true
        }
      }, {
        tableName: 'users'
      });
    
      users.associate = function (models) {
        users.belongsTo(models.user_types, {
          foreignKey: "type",
          as: "userType"
        });
        users.hasMany(models.user_logs, {
          foreignKey: "user_id",
          as: "userLogs"
        });
      };
    
      return users;
    };
    

    更多参数和细节可以查看Sequelize doc,非常简单,示例和细节丰富。

    另外,我使用了一些 ECMAScript 6,因此如果您的 Node.js 版本不支持,请更改或转译此代码。

    【讨论】:

    • 感谢您对 Sequelize 的回复。我已经设计了整个数据库模式,这个模块允许我使用现成的数据库吗?
    • 是的,您可以在已经存在的数据库上使用。请注意,在运行 Sequelize.sync() 方法时,数据库的结构与模型同步,并且可能会产生结构更改。我在不是通过 Sequelize 生成的现有数据库上使用 Sequelize(它被其他几个没有 Sequelize 的应用程序使用)并且我避免执行同步方法。在这种情况下,如果模型过时,可能会产生一些错误。但是,如果您的模型是用于创建数据库结构的模型,那将是一个问题。希望对您有所帮助。
    • 好的,我明白了,最后一件事我想请你,因为我从未使用过 Sequelize,你能否附上你的项目的简单代码示例,它与模式连接并制作模型表之一。提前谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多