egg.js项目初始化

创建项目和基础配置

全局配置npm源

npm config set registry https://registry,npm.taobao.org

egg.js初始化

mkdir egg-example && cd egg-example
npm init egg --type=simple --registry https://registry.npm.taobao.org
npm install

启动项目

npm run dev

关闭csrf开启跨域

// 安装扩展
npm i egg-cors --save

// 启用egg-cors插件 /config/plugin.js
cors:{
  enable: true,
  package: 'egg-cors',
},

// 参数配置 config / config.default.js
config.security = {
    // 关闭 csrf
    csrf: {
        enable: false,
    },
    // 跨域白名单
    domainWhiteList: [ 'http://localhost:3000' ],
};

// 允许跨域的方法
config.cors = {
    origin: '*',
    allowMethods: 'GET, PUT, POST, DELETE, PATCH'
};

全局异常中间件

中间件app/middleware/error_handler.js

module.exports = (option, app) => {
    return async function errorHandler(ctx, next) {
      try {
        await next(); 
        // 404 处理
        if(ctx.status === 404 && !ctx.body){
           ctx.body = { 
               msg:"fail",
               data:'Not Find'
           };
        }
      } catch (err) {
        const status = err.status || 500;
        // 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
        const error = status === 500 && app.config.env === 'prod'? 'Internal Server Error': err.message;
        ctx.body = { 
            msg:"fail",
            data:error
        };
        ctx.status = status;
      }
    };
  };

注册到全局配置中 config/config.default.js

config.middleware = ['errorHandler'];

接口返回值封装

// app\extend\context.js
module.exports = {
    success(data = '', msg = 'ok', code = 200) {
        this.status = code
        this.body = {
            msg,
            data
        }
    },
    error(data = '', msg = 'fail', code = 400) {
        this.status = code;
        this.body = {
            msg,
            data
        }
    }
};

数据库sequelize

安装配置

// 安装必要的扩展
npm install --save egg-sequelize mysql2

//启动扩展 config/plugin.js
exports.sequelize = {
  enable: true,
  package: 'egg-sequelize',
};

//配置sequelize 扩展 config/config.default.js
config.sequelize = {
    dialect:  'mysql',
    host:  '127.0.0.1',
    username: 'root',
    password:  '123456',
    port:  3306,
    database:  'database_development',
    // 中国时区
    timezone:  '+08:00',
    define: {
        // 取消数据表名复数
        freezeTableName: true,
        // 自动写入时间戳 created_at updated_at
        timestamps: true,
        // 字段生成软删除时间戳 deleted_at
        // paranoid: true,
        createdAt: 'created_at',
        updatedAt: 'updated_at',
        // deletedAt: 'deleted_at',
        // 所有驼峰命名格式化
        underscored: true
    }
};

数据迁移

//安装扩展
npm install --save-dev sequelize-cli

//配置文件 .sequelizerc
'use strict';
const path = require('path');
module.exports = {
  config: path.join(__dirname, 'database/config.json'),
  'migrations-path': path.join(__dirname, 'database/migrations'),
  'seeders-path': path.join(__dirname, 'database/seeders'),
  'models-path': path.join(__dirname, 'app/model'),
};

//初始化 Migrations 配置文件和目录
npx sequelize init:config
npx sequelize init:migrations
// npx sequelize init:models

创建数据库

npx sequelize db:create

创建迁移文件

npx sequelize migration:generate --name=user

最终生成一个文件\database\migrations\******-init-user.js

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  }
};

执行迁移

npx sequelize db:migrate

迁移回滚

// 如果有问题需要回滚,可以通过 `db:migrate:undo` 回退一个变更
npx sequelize db:migrate:undo
// 可以通过 `db:migrate:undo:all` 回退到初始状态
npx sequelize db:migrate:undo:all

模型关联

User.associate = function(models) {
   // 关联用户资料 一对一
   User.hasOne(app.model.Userinfo);
   // 反向一对一关联
   // Userinfo.belongsTo(app.model.User);
   // 一对多关联
   User.hasMany(app.model.Post);
   // 反向一对多关联
   // Post.belongsTo(app.model.User);
   // 多对多
   // User.belongsToMany(Project, { as: 'Tasks', through: 'worker_tasks', foreignKey: 'userId' })
   // 反向多对多
   // Project.belongsToMany(User, { as: 'Workers', through: 'worker_tasks', foreignKey: 'projectId' })
}

你可能感兴趣的:(javascript)