创建项目和基础配置
全局配置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' })
}