一 、创建项目:

1、使用egg.js框架提供的脚手架搭建:

npm i -g egg-init
egg-init egg-demo --type=simple    //--type=simple可以去掉然后自己配置
cd egg-demo
npm i

2、启动项目:

npm run dev
浏览器打开:localhost:7001

二、项目配置

1、Controller

#使用场景
编写 Controller
我们约定把 Controller 放置在 app/controller 目录下:

// app/controller/user.js

const { Controller } = require('egg');class UserController extends Controller {async create() {const { ctx, service } = this;// 获取请求信息const userInfo = ctx.request.body;// 校验参数ctx.assert(userInfo && userInfo.name, 422, 'user name is required.');// 调用 Service 进行业务处理const result = await service.user.create(userInfo);// 响应内容和响应码ctx.body = result;ctx.status = 201;}
}
module.exports = UserController;

然后通过路由配置 URL 请求映射:

// app/router.js
module.exports = app => {const { router, controller } = app;router.post('/api/user', controller.user.create);
};

然后通过 POST /api/user 即可访问

2、Service

#使用场景
编写 Service
我们约定把 Service 放置在 app/service 目录下:

// app/service/user.js
const { Service } = require('egg');class UserService extends Service {async find(uid) {const user = await this.ctx.db.query('select * from user where uid = ?', uid);return user;}
}module.exports = UserService;

使用 Service
框架会默认挂载到 ctx.service 上,对应的 Key 为文件名的驼峰格式。

如上面的 Service 会挂载为 ctx.service.user。

然后就可以在 Controller 里调用:

// app/controller/user.js
const { Controller } = require('egg');class UserController extends Controller {async info() {const { ctx } = this;const userId = ctx.params.id;const userInfo = await ctx.service.user.find(userId);ctx.body = userInfo;}
}module.exports = UserController;

3、Router

#使用场景
编写路由
我们约定 app/router.js 文件用于统一所有路由规则。

通过统一的配置,可以避免路由规则逻辑散落在多个地方,从而出现未知的冲突,可以更方便的来查看全局的路由规则。

假设有以下 Controller 定义:

// app/controller/user.js
class UserController extends Controller {async info() {const { ctx } = this;ctx.body = {name: `hello ${ctx.params.id}`,};}
}
则我们可以定义对应的路由如下:// app/router.js
module.exports = app => {const { router, controller } = app;// GET /user/123router.get('/user/:id', controller.user.info);
};

路由路径

即为上面的 /some-path,并支持命名参数。

// app/router.js
module.exports = app => {const { router, controller } = app;router.get('/home', controller.home.index);// 支持命名参数,通过 `ctx.params.id` 可以取出。router.get('/user/:id', controller.user.detail);
};

也支持正则式:

// app/router.js
module.exports = app => {const { router, controller } = app;

// 可以通过 ctx.params[0] 获取到对应的正则分组信息。

  router.get(/^\/package\/([\w-.]+\/[\w-.]+)$/, controller.package.detail);
};

如果你有一个通配的路由映射,需注意顺序,放在后面,如:

router.get('/user/manager', controller.user.manager);
router.get('/user/:id', controller.user.detail);

4、Middleware

#使用场景
编写中间件
我们约定把中间件放置在 app/middleware 目录下:

// app/middleware/response_time.js

module.exports = () => {return async function responseTime(ctx, next) {const start = Date.now();await next();const cost = Date.now() - start;ctx.set('X-Response-Time', `${cost}ms`);}
};

5、连接数据库

sequelize数据库配置

  1. 安装并配置egg-sequelize插件(它会辅助我们将定义好的 Model 对象加载到 app 和 ctx 上)和mysql2模块:
npm install --save egg-sequelize mysql2
  1. config/plugin.js中引入 egg-sequelize 插件
exports.sequelize = {enable: true,package: 'egg-sequelize',
};
  1. config/config.default.js

config.sequelize = {dialect: 'mysql',host: '127.0.0.1',username: "root",password: 'root',port: 3306,database: 'egg-clouddisk',// 中国时区timezone: '+08:00',define: {// 取消数据表名复数freezeTableName: true,// 自动写入时间戳 created_at updated_attimestamps: true,// 字段生成软删除时间戳 deleted_at// paranoid: true,createdAt: 'created_time',updatedAt: 'updated_time',// deletedAt: 'deleted_time',// 所有驼峰命名格式化underscored: true}};

数据库迁移配置

  1. sequelize 提供了sequelize-cli工具来实现Migrations,我们也可以在 egg 项目中引入 sequelize-cli。
npm install --save-dev sequelize-cli
  1. egg 项目中,我们希望将所有数据库 Migrations 相关的内容都放在database目录下,所以我们在项目根目录下新建一个.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'),
};
  1. 初始化 Migrations 配置文件和目录
npx sequelize init:config
npx sequelize init:migrations
// npx sequelize init:models
  1. 行完后会生成database/config.json文件和database/migrations目录,我们修改一下database/config.json中的内容,将其改成我们项目中使用的数据库配置:
{"development": {"username": "root","password": null,"database": "egg-clouddisk","host": "127.0.0.1","dialect": "mysql","timezone": "+08:00"}
}

5.创建数据库

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

创建数据迁移表

npx sequelize migration:generate --name=user

1.执行完命令后,会在database / migrations / 目录下生成数据表迁移文件,然后定义

'**use strict';module.exports = {up:** (queryInterface, Sequelize) => {const { INTEGER, STRING, DATE, ENUM, TEXT } = Sequelize;return queryInterface.createTable('user', {id: {type: INTEGER(20),primaryKey: true,autoIncrement: true},username: {type: STRING(30),allowNull: false,defaultValue: '',comment: '用户名',unique: true},nickname: {type: STRING(30),allowNull: false,defaultValue: '',comment: '昵称',},email: {type: STRING(160),allowNull: false,defaultValue: '',comment: '邮箱'},password: {type: STRING,allowNull: false,defaultValue: '',comment: "密码"},avatar: {type: STRING,allowNull: true,defaultValue: '',comment: '头像'},phone: {type: STRING(11),allowNull: false,defaultValue: '',comment: '手机'},sex: {type: ENUM,values: ["男", '女', '保密'],allowNull: false,defaultValue: '男',comment: '性别'},desc: {type: TEXT,allowNull: false,defaultValue: '',comment: '个性签名',},total_size: {type: INTEGER,defaultValue: 0,comment: '网盘总大小,单位:kb',},used_size: {type: INTEGER,defaultValue: 0,comment: '网盘已使用大小,单位:kb',},created_time: DATE,updated_time: DATE,});},down: (queryInterface, Sequelize) => {return queryInterface.dropTable('user');}
};
  • 执行 migrate 进行数据库变更
npx sequelize db:migrate

模型创建

在app创建model文件夹,创建user文件,文件必须跟数据表名一样

定义

// app/model/user.js
const crypto = require('crypto');
module.exports = app => {const { STRING, INTEGER, DATE, ENUM, TEXT } = app.Sequelize;const User = app.model.define('user', {id: {type: INTEGER(20),primaryKey: true,autoIncrement: true},username: {type: STRING(30),allowNull: false,defaultValue: '',comment: '用户名',unique: true},nickname: {type: STRING(30),allowNull: false,defaultValue: '',comment: '昵称',},email: {type: STRING(160),allowNull: false,defaultValue: '',comment: '邮箱'},password: {type: STRING,allowNull: false,defaultValue: '',comment: "密码",set(val) {const hmac = crypto.createHash("sha256", app.config.crypto.secret);hmac.update(val);let hash = hmac.digest("hex");this.setDataValue('password', hash);}},avatar: {type: STRING,allowNull: true,defaultValue: '',comment: '头像'},phone: {type: STRING(11),allowNull: false,defaultValue: '',comment: '手机'},sex: {type: ENUM,values: ["男", '女', '保密'],allowNull: false,defaultValue: '男',comment: '性别'},desc: {type: TEXT,allowNull: false,defaultValue: '',comment: '个性签名',},total_size: {type: INTEGER,defaultValue: 10485760,comment: '网盘总大小,单位:kb',},used_size: {type: INTEGER,defaultValue: 0,comment: '网盘已使用大小,单位:kb',},created_time: DATE,updated_time: DATE,});// User.associate = function (models) {//    // 关联文件//    User.hasMany(app.model.File);// }return User;
};

如何使用egg.js开发后端,包含连接数据库相关推荐

  1. 我开发了一个基于 Egg.js 的后端脚手架

    背景 之前基于 Egg.js 开发了几个项目,发现每个项目中都有配置文件.数据库连接操作.数据模型定义.微信登陆授权处理等功能,而做新项目时总会复制之前的项目来删删改改,有时候在 A 项目中添加了一个 ...

  2. 详细记录基于vue+nodejs+mongodb构建的商城学习(四)基于项目的node.js开发后端的学习与梳理总结...

    前置: 本系列文章是一个本人边学习边梳理的学习笔记,俗话说好脑袋不如烂笔头,再好的记忆力时间长了也会有细节忘记,本项目选择的前端框架是vue,后端开发使用是node.js,数据库使用的是mongodb ...

  3. egg.js开发 文章发布接口(图片上传)(表单数据接口)

    后台的代码: 在//app/config/config.default.js文件里:  添加crsf 这也是解决post请求时 报403 foibidden的方法 //解决跨域config.secur ...

  4. 【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》

    20210226-20210227:<Egg.js框架入门与实战> 课程地址:https://www.imooc.com/learn/1185 第一章 课程导学 01-01 课程介绍 一. ...

  5. Egg.js + MySQL + React + Antd-Mobile 实战移动端私人日记本

    前端工程师这个职业是一个很杂,且边界模糊的职业.无论你承认与否,事实就是如此.你甚至可以在某一个很小的领域里翻江倒海,比如专攻可视化.Canvas.Node.多媒体等等.但是我认为,作为一名前端工程师 ...

  6. egg 编码规范_从 Egg.js 到 NestJS,爱码客后端选型之路

    序 爱码客3.0 开始开发到现在已经过去快整整一年了,虽然我投入其中的时间只有短短4个月,但是在最初后端几乎只有我一个人投入的情况下,可以说也是研究了一些东西,蹚了二三次浑水,来来回回改过五六次结构, ...

  7. vue mysql 电商_mei-shopone: nuxt(vue)+node(egg.js)+mysql晒点风格极简商城,电商系统。适合入门全栈开发,槑先森工作室。...

    mei-shopone 前言 此项目是基于nuxt+egg+mysql开发的在线商城系统全栈模板,目前前端部分已适配移动端.面向开发人员友好,快速,轻巧,干净,并包含W3有效源代码.后台管理系统基于v ...

  8. egg extend ts_从 Egg.js 到 NestJS,爱码客后端选型之路

    序 爱码客3.0 开始开发到现在已经过去快整整一年了,虽然我投入其中的时间只有短短4个月,但是在最初后端几乎只有我一个人投入的情况下,可以说也是研究了一些东西,蹚了二三次浑水,来来回回改过五六次结构, ...

  9. 后端——egg.js是什么、egg.js安装、约定规则、路由Router、控制器Controller、跨域

    目录 一.egg.js是什么 二.egg安装 三.约定规则 四.路由Router 五.控制器Controller 六.跨域 1.egg-cors 1.下载 2.开启插件 3.配置插件 4.使用: 2. ...

最新文章

  1. Python设计模式-观察者模式
  2. 01-1制作U盘启动盘--大白菜超级U盘启动盘制作工具
  3. sort (STL)
  4. python英语翻译-python制作英语翻译小工具代码实例
  5. python super 理解(一)
  6. PHP初级学习之PHP文件
  7. 别傻了,你还认为 count(1) 比 count(*) 效率高?
  8. Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
  9. docker 安装 GridStudio
  10. Tensorflow 梯度下降实例
  11. 自动控制原理学习笔记(二)线性定常连续控制系统的数学模型
  12. mujoco win7下载安装
  13. 汇编语言教程 -- 开始
  14. Android 获取assets文件夹下面的文件路径
  15. vps mysql_vps mysql自动关闭
  16. request请求参数中文乱码问题
  17. 服务器什么系统好用点,服务器用什么系统好
  18. 经典智力题:工人分金条问题
  19. 玩乐|杭州夏季纳凉好去处
  20. 全志JAVA_全志R11处理器参数详细说明

热门文章

  1. swift 解决SDWebImage同时加载大量高分辨率图片导致的内存爆炸问题
  2. 融合收敛因子和樽海鞘群的蝴蝶优化算法
  3. 我的世界hmcl启动器登录教程
  4. 基于DEAP的脑电情绪识别论文源码改进版本(附论文代码,lstm和rnn)
  5. Android Camera 架构
  6. C# winform与Javascript的相互调用
  7. freebsd mysql 配置_FreeBSD#MySQL安装配置
  8. 计算机专业英语问卷调查,问卷调查英语版.doc
  9. 「自控元件及线路」1.1 直流电动机概述
  10. 地级市年末实有耕地面积、人均耕地面积、行政区域土地面积、人口密度等(1999-2018年)