eggjs框架及demo环境搭建
前言:学习nodejs作为服务端的eggjs,成本还是不小的,把很久以前的东西重新捡回来的感觉。要记忆大量的知识点。
学习egg.js,看这一篇就够了!
https://juejin.cn/post/6995063516470198279
文章包含如何添加中间件middleware、集成MySQL和MongoDB。
官方文档:
https://www.eggjs.org/zh-CN/tutorials/mysql 内容更完整。
https://eggjs.github.io/zh/guide/
文档不适合短时间看完,知识点平铺直叙,没法让你快速进入状态。所以适合实际用到的时候回来查询。
eggjs连接数据库
我自己亲测的版本是:https://www.cnblogs.com/zccst/p/17515047.html
下面的版本供参考
1,先安装插件,并开启
npm i egg-mysql
在 config/plugin.js
中开启插件:
exports.mysql = {
enable: true,
package: 'egg-mysql',
}
2,在 config/config.default.js
中定义连接参数:
config.mysql = {
client: {
host: 'localhost',
port: '3306',
user: 'root',
password: 'root',
database: 'cms',
}
}
3,集成
app.mysql
中获取到 mysql 对象,例如:class UserService extends Service {
async find(uid) {
const user = await this.app.mysql.get('users', { id: 11 });
return { user }
}
}
方式2:使用当前最流行的ORM框架sequelize
更好的集成 MySQL 的方式是借助 ORM 框架来帮助我们管理数据层的代码,sequelize 是当前最流行的 ORM 框架,它支持 MySQL、PostgreSQL、SQLite 和 MSSQL 等多个数据源,接下来我们使用 sequelize 来连接 MySQL 数据库,首先安装依赖:
npm install egg-sequelize mysql2 --save
yarn add egg-sequelize mysql2
然后在 config/plugin.js
中开启 egg-sequelize 插件:
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
}
同样要在 config/config.default.js
中编写 sequelize 配置
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'example',
username: 'root',
password: '123456',
}
然后在 egg_example 库中创建 books 表:
CREATE TABLE `books` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`name` varchar(30) DEFAULT NULL COMMENT 'book name',
`created_at` datetime DEFAULT NULL COMMENT 'created time',
`updated_at` datetime DEFAULT NULL COMMENT 'updated time',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='book';
Sequelize 操作Mysql实现增删改查
(1)创建 model/book.js
文件,代码是:
module.exports = app => {
const { STRING, INTEGER } = app.Sequelize
const Book = app.model.define('book', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
})
return Book
}
(2)添加 controller/book.js
控制器:(或在Service中)
const Controller = require('egg').Controller
class BookController extends Controller {
async index() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.findAll({})
}
async show() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.findByPk(+ctx.params.id)
}
async create() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.create(ctx.request.body)
}
async update() {
const ctx = this.ctx
const book = await ctx.model.Book.findByPk(+ctx.params.id)
if (!book) return (ctx.status = 404)
await book.update(ctx.request.body)
ctx.body = book
}
async destroy() {
const ctx = this.ctx
const book = await ctx.model.Book.findByPk(+ctx.params.id)
if (!book) return (ctx.status = 404)
await book.destroy()
ctx.body = book
}
}
module.exports = BookController
最后配置 RESTful 路由映射:
module.exports = app => {
const {router, controller} = app
router.resources('books', '/books', controller.book)
}
踩过的坑:
这个站点不靠谱:https://github.com/eggjs/egg-ant-design-pro