美文网首页
nodeJs 服务器以及中间层实践(二)

nodeJs 服务器以及中间层实践(二)

作者: bartflyian | 来源:发表于2020-01-21 15:05 被阅读0次

    二、服务器与数据库

    https://github.com/bartflyian/wx-front-with-server/tree/master/ 文件代码地址。
    第一篇已经使用koa对不同请求做不同的路由处理,如 GET /、POST /add;当在客户端页面请求这些地址时,我们想其返回带有数据库数据的json。那么首先,需要建立数据库连接:
    1. 安装mysql,数据库视图管理工具我用的是Navicat
    2. 新建一个名为 koa 的数据库,创建新的users表:

          use koa;
    
          create table users (
    
              id varchar(50) not null,
    
              name varchar(100) not null,
    
              gender bool not null,
    
              birth varchar(10) not null,
    
              createdAt bigint not null,
    
              updatedAt bigint not null,
    
              version bigint not null,
    
              primary key (id)
    
          ) engine=innodb;
    
    1. 服务器想要操作数据库表,需要书写对应的sql语句,在这里我用到Node的ORM框架Sequelize,即是创建与数据库的映射,当然也有自己的书写规范,所以还需要看看sequelize文档了解一下,不过在这只用到基础的增删改查。
      依赖包添加"sequelize": "3.24.1",或者直接npm install
      (1) 创建 config文件夹,其下创建DBconfig.js:
    image.png

    (2) 创建 lib 文件夹,其下创建mysql.js,在此使用sequelize连接数据库,并作数据表的映射sequelize先new一个Sequelize对象连接数据库,然后用sequelize.define对具体的表作映射处理。在这里将这两个过程封装到mysql.js中:

    const Sequelize = require('sequelize');
    
    const config = require('../config/DBconfig');
    
    console.log('init sequelize...');
    
    var sequelize = new Sequelize(config.database, config.username, config.password, {
    
        host: config.host,
    
        dialect: 'mysql',
    
        pool: {
    
            max: 5,
    
            min: 0,
    
            idle: 30000
    
        }
    
    });
    
    const ID_TYPE = Sequelize.STRING(50);
    
    function defineModel(name, attributes) {
    
        var attrs = {};
    
        for (let key in attributes) {
    
            let value = attributes[key];
    
            if (typeof value === 'object' && value['type']) {
    
                value.allowNull = value.allowNull || false;
    
                attrs[key] = value;
    
            } else {
    
                attrs[key] = {
    
                    type: value,
    
                    allowNull: false
    
                };
    
            }
    
        }
    
        attrs.id = {
    
            type: ID_TYPE,
    
            primaryKey: true
    
        };
    
        attrs.createdAt = {
    
            type: Sequelize.BIGINT,
    
            allowNull: false
    
        };
    
        attrs.updatedAt = {
    
            type: Sequelize.BIGINT,
    
            allowNull: false
    
        };
    
        attrs.version = {
    
            type: Sequelize.BIGINT,
    
            allowNull: false
    
        };
    
        return sequelize.define(name, attrs, {
    
            tableName: name,
    
            timestamps: false,
    
            hooks: {
    
                beforeValidate: function (obj) {
    
                    let now = Date.now();
    
                    if (obj.isNewRecord) {
    
                        if (!obj.id) {
    
                            obj.id = generateId();
    
                        }
    
                        obj.createdAt = now;
    
                        obj.updatedAt = now;
    
                        obj.version = 0;
    
                    } else {
    
                        obj.updatedAt = Date.now();
    
                        obj.version++;
    
                    }
    
                }
    
            }
    
        });
    
    }
    
    var db = {
    
        sync: () => {
    
            if (process.env.NODE_ENV !== 'production') {
    
                sequelize.sync({ force: true });
    
            } else {
    
                throw new Error('Cannot sync() when NODE_ENV is set to \'production\'.');
    
            }
    
        }
    
    };
    
    db.defineModel = defineModel;
    
    const TYPES = ['STRING', 'INTEGER', 'BIGINT', 'TEXT', 'DOUBLE', 'DATEONLY', 'BOOLEAN'];
    
    for (let type of TYPES) {
    
        db[type] = Sequelize[type];
    
    }
    
    db.ID = ID_TYPE;
    
    module.exports = db;
    
    

    (defineModel统一处理数据库表中通用的字段如id...,最后return出一个sequelize.define方法,这样我们在创建sequelize数据表映射时,可以简洁许多)。

    (3) 创建 models 文件夹, 存放所有数据表映射,我们先创建user.js:

    image

    (都使用刚刚封装的defineModel方法)

    新建model.js,对models文件夹下的文件作自动化的读取和导出;

    image

    (4) 创建service 文件夹, 存放对数据库的操作文件。我们先创建user.js:

    image

    并引入model,现在里面已经存在自动化导出的user对象;

    我在这里只做数据查找,添加和删除。这样在之前koa创建的controller中,引入user,使用await对数据库做处理后返回数据。

    运行 node app.js,在浏览器输入localhost:3000。在输入框输入新用户名,点击添加按钮发送post请求,刷新后发现下面已经显示数据库中存在的用户列表。

    相关文章

      网友评论

          本文标题:nodeJs 服务器以及中间层实践(二)

          本文链接:https://www.haomeiwen.com/subject/sbsezctx.html