搭建环境
1. 安装node
2. 安装koa
npm install koa --save
3. 使用koa-generator项目生成器
npm install koa-generator -g
4. 创建项目
koa2 bbs
- 启动项目
npm install
├─app
| ├─app.js
| ├─package.json
| ├─views
| | ├─error.pug
| | ├─index.pug
| | └layout.pug
| ├─routes
| | ├─index.js
| | └users.js
| ├─public
| | ├─stylesheets
| | | └style.css
| | ├─javascripts
| | ├─images
| ├─bin
| | └www
npm start
6. 安装sequelize
npm install sequelize --save
7. 安装数据库
npm install mysql mysql2 --save
8. config\db.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('dbname','dbusername','password',{
host:'localhost',
dialect:'mysql',
operatorsAliases:false,
dialectOptions:{
//字符集
charset:'utf8mb4',
collate:'utf8mb4_unicode_ci',
supportBigNumbers: true,
bigNumberStrings: true
},
pool:{
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
timezone: '+08:00' //东八时区
});
module.exports = {
sequelize
};
9. 创建schema、modules、controllers
创建schema、modules、controllers
schema:数据表模型实例
modules:实体模型
controllers:控制器
10. schema目录下的article.js ,数据库模型,创建表结构
const moment = require("moment");
module.exports = function(sequelize,DataTypes){
return sequelize.define('article',{
id:{
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: true,
autoIncrement: true
},
//文章标题
title:{
type: DataTypes.STRING,
allowNull: false,
field: 'title'
},
//作者
author:{
type: DataTypes.STRING,
allowNull: false,
field: 'author'
},
//内容
content:{
type: DataTypes.STRING,
allowNull: false,
field:'content'
},
//文章分类
category:{
type: DataTypes.STRING,
allowNull: false,
field: 'category'
},
// 创建时间
createdAt:{
type: DataTypes.DATE
},
// 更新时间
updatedAt:{
type: DataTypes.DATE
}
}
},{
/**
* 如果为true,则表示名称和model相同,即user
* 如果为fasle,mysql创建的表名称会是复数,即users
* 如果指定的表名称本身就是复数,则形式不变
*/
freezeTableName: true
});
}
11. 在项目中modules目录下创建article.js文件为文章表,该文件为文章的实例。
// 引入mysql的配置文件
const db = require('../config/db');
// 引入sequelize对象
const Sequelize = db.sequelize;
// 引入数据表模型
const Article = Sequelize.import('../schema/article');
Article.sync({force: false}); //自动创建表
class ArticleModel {
/**
* 创建文章模型
* @param data
* @returns {Promise<*>}
*/
static async createArticle(data){
return await Article.create({
title: data.title, //标题
author: data.author, //作者
content: data.content, //文章内容
category: data.category //文章分类
});
}
/**
* 查询文章的详情
* @param id 文章ID
* @returns {Promise<Model>}
*/
static async getArticleDetail(id){
return await Article.findOne({
where:{
id
}
});
}
}
module.exports = ArticleModel;
12. 控制器的主要作用为功能的处理,项目中controller目录下创建article.js
const ArticleModel = require("../modules/article");
class articleController {
/**
* 创建文章
* @param ctx
* @returns {Promise.<void>}
*/
static async create(ctx){
//接收客服端
let req = ctx.request.body;
if(req.title && req.author && req.content && req.category){
try{
//创建文章模型
const ret = await ArticleModel.createArticle(req);
//使用刚刚创建的文章ID查询文章详情,且返回文章详情信息
const data = await ArticleModel.getArticleDetail(ret.id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '创建文章成功',
data
}
}catch(err){
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '创建文章失败',
data: err
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 200,
msg: '参数不齐全'
}
}
}
/**
* 获取文章详情
* @param ctx
* @returns {Promise.<void>}
*/
static async detail(ctx){
let id = ctx.params.id;
if(id){
try{
// 查询文章详情模型
let data = await ArticleModel.getArticleDetail(id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '查询成功',
data
}
}catch(err){
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '查询失败',
data
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 416,
msg: '文章ID必须传'
}
}
}
}
module.exports = articleController;
13. 路由
const Router = require('koa-router');
const ArtileController = require('../controllers/article');
const router = new Router({
prefix: '/api/v1'
});
/**
* 文章接口
*/
//创建文章
router.post('/article/create',ArtileController.create);
//获取文章详情
router.get('/article/:id',ArtileController.detail)
module.exports = router
14. 解决跨域
npm install koa-cors --save
const cors = require('koa-cors')
app.use(cors()) //使用cors