koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
现在主要还是做前端工作,不过这阵子基本都在学习Node这一块的知识,发现Node的官方文档确实很“精简”,不过还是可以克服,不行就谷歌百度嘛!这周用koa2框架写了一个简单的Feedback接口,其实花了一下午时间(手动滑稽,在这期间被后端工程师叼了很多次,都怪自己还是不够细心,一些问题上总是出现很傻瓜式的错误,还有切记不要做伸手党,不懂就查文档,搜索,不要一遇到问题就寻求别人助攻。接下来进入正题。
反馈功能,首先肯定要有数据库存储数据,这里用mysql,安装mysql,教程自行百度;node环境也是必须的,毕竟koa是基于nodejs的,这里系统环境还是推荐使用Linux,用起来特别爽,以上步骤准备完毕后,用npm安装mysql驱动:1
npm install mysql --save
–save只是用来将库存储到package.json文件中,这样别人拉你项目后,只要该文件有的库,直接npm install就OK了,没有该文件要记得创建。新建一个文件夹,名叫model,创建feedback.js文件,引用mysql库:1
const mysql = require('mysql');
创建类Feedback,这里会用到一些es7语法,不过还是能理解的,用来解决异步同步问题,首先要连接数据库,当然要先自己创建database,新建数据表,然后保存,这里表的结构大概是:id[自增],email,feedback,createTime;这个结构自己创建,不懂怎么弄自行找方法解决。
创建class Feedback{…}类后,添加constructor(){…}方法,里面用来连接数据库,1
2
3
4
5
6
7this.connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'your database name',
port: '8088'
});
这样就可以用来连接到数据库了,接下来就查询数据库中的内容,然后通过网页进行反问,这里用异步方法,添加async list(){…},用来查询数据库内容,1
2
3
4
5
6
7return new Promise((resolve,reject)=>{
this.connection.query('select * from feedback_content',
(error,results,fields)=> {
if(error) {reject();}
resolve(results);
});
});
这样就可以通过路由进行访问,展示数据库中的数据了,创建文件夹routes,创建文件feedback.js,同样定义类Feedback,这里这些文件命名自己定义就好了,接着引入models/feeback,1
const FeedbackModel = require('../models/feedback');
创建async list(ctx){…}方法,调用model/feedback中的list方法,将查询到的数据展示到页面,1
2let rs = await FeedbackModel.list();
ctx.body = rs;
其中里面的await要加上去,获取到results,然后将内容展示到body中,两个feedback.js文件都要创建好对象然后暴露出去,1
module.exports = new Feedback();
接着当然是创建服务器去访问页面,看到数据库内容,在项目根目录创建app.js文件,这里要引入几个库,包括koa,koa-bodyParse,koa-router,1
2
3
4
5
6
7
8const koa = require('koa');
const bodyParse = require('koa-bodyParse');
const router = require('koa-router')({
prefix: '/feedback'
});
const path = require('path');
const APP_PATH = __dirname;
const ROUTE_PATH = path.join(APP_PATH,'/routes');
上述引用都引用完无误后,基本就快大功告成了,其中koa-bodyParse是用来解析http请求的,这个express框架也有这种库,koa-router那就是用来当路由使用的,比如你想跳转到哪个页面显示哪样的数据,路由帮你搞定,react中路由就可以用来渲染不同组件内容,然后还是不懂可以上github搜一下这几个玩意,看看文档应该能理解。接下来简单了,利用路由,展示routes/feedback中数据库的内容,1
2
3
4
5app.use(bodyParse());
router.get('/',FeedbackRoute.list);
app.use(router.routes())
.use(router.allowedMethods());
app.listen(3001);
以上步骤完成后,打开命令行,键入node app.js,浏览器输入localhost:3001/feedback,就可以访问到数据库的内容了,如果报错了,自己控制台看看错误原因,自己调试一下。以上就完成了从创建数据库,利用驱动访问数据库获取数据,利用koa框架以及路由完成了数据在页面中的展示。
接下来就是来写接口了,前端可以通过ajax对接口进行调用,在models/feedback文件中添加async insertText(email, feedback){…},同样是异步方法,用来往数据库中插入数据,1
2
3
4
5
6
7
8
9
10
11return new Promise((resolve,reject)=>{
let content = {
eamil: eamil,
feedback: feedbacak
}
this.connection.query(insert into feedback_content set ?, content,
(error,results,fields)=>{
if(error) reject();
resolve({success: 1});
});
});
这个方法就完成了往数据库中插入数据,接下来再models/feedback中同样添加async insertText(ctx){…}方法,这个方法用来获取前端传过来的数据,1
2
3
4
5
6
7
8
9let email = ctx.request.body.email;
let feedback = ctx.request.body.feedback;
//这里是正则匹配邮箱格式,怎么写自己脑补
let email_rg = /.../;
if(email_rg.test(email)){
let isSuccess =await FeedbackModel.insertText(email,feedback);
ctx.body={isSuccess: 1}
}
else {ctx.body = {isSuccess: 0}}
以上完成后,只需要添加路由就可以完成前端对接口的调用了,打开app.js文件,1
router.post('/',FeedbackRoute.insertText);
添加以上路由后就可以来测试接口是否可用了,可以用谷歌插件Restlet Client – DHC来对接口进行调试,打开DHC,输入127.0.0.1:3001/feedback,在body中输入1
2
3
4{
email: 123@gmail.com,
feedback: 'test'
}
点击send,看看返回的结果是不是isSuccess: 1,如果是代表已经成功,可以前往看看数据库中的最新数据,地址127.0.0.1:3001/,发现数据确实多了一项,这样这个接口就是已经没什么大问题了,注意:会发现feedback你传的是中文的时候,会发现DHC可能卡死,这里分析了原因,数据库没有设置utf8,只要修改下数据库表的编码就可以正常插入了。单纯用插件对接口进行测试可能有些问题还是发现不了的,前端需要模拟一下接口调用,通过ajax进行调用,这里不细说了,当前端页面输入邮箱、反馈内容后发现控制台报错了,原因肯定就是存在跨域问题,所以接口这边就要继续完善一下,添加一个header就搞定了1
2
3
4router.post('*', async(ctx, next)=>{
ctx.response.set('Access-Control-Allow-Origin', '*');
await next();
});
这样一个接口就搞定了,同时也能方便查看数据库中的数据,按照上述步骤能成功的,恭喜;失败的,不怪我(逃。