koa方法汇总学习,用于后续参考。
目录展示
项目介绍
module:存放自己封装的方法
routes:路由模块
static:存放所需静态文件
views:存放模板视图
app:入口文件
方法展示
app.js
//引入koa模块
var Koa = require('koa');
//引入path以便获取路径
var path = require('path');
//引入实例化路由 不同于express,这个必须得引入
var router = require('koa-router')();
//引入路由模块
var admin = require('./routes/admin.js');
//引入模板引擎,以便于渲染页面
var views = require('koa-views');
//引入模板
var ejs = require('ejs');
/*
art-template 模板引擎
相较于上面的ejs和其他模板引擎,它渲染页面更加快速,而且同时支持ejs语法和angular语法
安装:
npm install --save art-template
npm install --save koa-art-template
*/
var render = require('koa-art-template');
//引入自定义模块
var common = require('./module/common.js');
//引入koa-bodyparser模块用于获取post请求参数
var bodyParser = require('koa-bodyparser');
//引入koa-session用于设置session
var session = require('koa-session');
//引入静态资源中间件
var static = require('koa-static');
//实例化koa模块
var app = new Koa();
/*
配置模板
写法一:
app.use(views('views',{
extension:'ejs' //应用ejs模板引擎,模板以.ejs结尾
}))
*/
app.use(views(__dirname + '/views', { //模板路径
map:{
html:'ejs' //模板名称 模板需要以.html结尾 需要安装:npm install ejs --save
}
}))
//配置art-template模板
render(app, {
root: path.join(__dirname, 'views'), //文件路径
extname: '.html', //文件以什么结尾
debug: process.env.NODE_ENV !== 'production' //开启调试模式
});
//配置公共信息
app.use(async (ctx,next) => {
ctx.state.name = 'star';
await next();
})
//中间件的使用
app.use(async (ctx,next) => {
//路由找不到返回404页面
await next();
if(ctx.status == 404){
ctx.body = '这是一个404页面'
}
})
//配置koa-bodyparser中间件
app.use(bodyParser());
//配置session
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess', /** (string) cookie key (default is koa:sess) */
maxAge: 86400000, //cookie过期时间
autoCommit: true, /** (boolean) automatically commit headers (default true) */
overwrite: true, /** (boolean) can overwrite or not (default true) */
httpOnly: true, //true只能在服务器端获取cookie,false客户端和服务器端均可获取
signed: true, //设置签名
rolling: true, //每当操作页面的时候,重新去设置cookie的时长
renew: true //每当cookie快要到期的时候重新去设置cookie的时长
};
app.use(session(CONFIG,app));
//配置静态资源中间件
app.use(static('.'));
app.use(static('static'));
app.use(static(__dirname + '/static'));
//配置路由
router.get('/',async (ctx) => { //ctx为上下文内容,里面包含了很多东西,有requery,response,writeHead,end等
ctx.body = '这是首页'
})
router.use('/admin',admin)
//启动路由
app
.use(router.routes())
.use(router.allowedMethods()); //根据之前配置路由返回的状态,针对一些失败的设置response响应头
//监听端口
app.listen(3000);
封装模块
连接操作数据库module/db.js
//引入MongoClient
var MongoClient = require('mongodb').MongoClient;
//需要使用mongo中的_id,则需要使用ObjectId
var ObjectId = require('mongodb').ObjectId;
//引入配置模块
var app = require('./config.js');
class DB {
static getInstance(){//1.单例 解决多次实例化实例不共享的问题,实现无论几次实例,只连接一次数据库
if(!DB.instance){//无实际含义,就是为了进行判断
DB.instance = new DB();//实例化
}
return DB.instance;
}
constructor(){
this.dbClient = ''; //放db对象
this.connect();//先进行连接,则无需在实例化中连接
}
connect(){//连接数据库
return new Promise((resolve,reject) => {
if(!this.dbClient){//判断是否有db对象,是否连接了数据库
MongoClient.connect(app.dbUrl,(err,client) => {
if(err){
reject(err)
}else{
this.dbClient = client.db(app.dbName);
resolve(this.dbClient)
}
})
}else{
resolve(this.dbClient)
}
})
}
//查找
find(collectionName,json){
return new Promise((resolve,reject) => {
this.connect().then((db) => {
var data = db.collection(collectionName).find(json);
data.toArray((err,docs) => {
if(err){
reject(err);
return;
}
resolve(docs)
})
})
})
}
//增加
insert(collectionName,json){
return new Promise((resolve,reject) => {
this.connect().then((db) => {
db.collection(collectionName).insertOne(json,(err,result) => {
if(err){
reject(err)
}else{
resolve(result)
}
})
})
})
}
//修改
update(collectionName,json1,json2){
return new Promise((resolve,reject) => {
this.connect().then((db) => {
db.collection(collectionName).updateOne(json1,{$set:json2},(err,result) => {
if(err){
reject(err)
}else{
resolve(result)
}
})
})
})
}
//删除
delete(collectionName,json){
return new Promise((resolve,reject) => {
this.connect().then((db) => {
db.collection(collectionName).removeOne(json,(err,result) => {
if(err){
reject(err)
}else{
resolve(result)
}
})
})
})
}
//将id转化为mongo可识别的ObjectId
getObjectId(id){
return new ObjectId(id);
}
}
module.exports = DB.getInstance();
路由模块
动态路由get传值:
var router = require('koa-router')();
router
.get('/newList',async (ctx) => { //http://localhost:3000/newList?aid=123
//获取get传值
console.log(ctx.query);//返回的值为对象 { aid: '123' }
console.log(ctx.querystring);//返回的值为字符串 aid=123
console.log(ctx.url);//获取请求路由 /newList?aid=123
console.log(ctx.request);//获取请求的相关数据
/*
{
method: 'GET',
url: '/newList?aid=123',
header:{
host: 'localhost:3000',
connection: 'keep-alive',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 6
(KHTML, like Gecko) Chrome/69.0.3497.12 Safar
accept: 'text/html,application/xhtml+xmlmage/apng,/;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9'
}
}
*/
ctx.body = '新闻列表'
})
//动态路由
.get('/newcontent/:aid',async (ctx) => { //http://localhost:3000/newcontent/123
//获取动态路由的数据
ctx.body = ctx.params; // {"aid":"123"}
})
//暴露路由
module.exports = router.routes();
session操作:
var router = require('koa-router')();
router
//session设置
.get('/setSession', async (ctx) => {
ctx.session.count = 5;
ctx.body = 'session设置成功';
})
//session获取
.get('/getSession', async (ctx) => {
ctx.body = '当前数量为' + ctx.session.count;
})
//暴露路由
module.exports = router.routes();
cookie操作:
var router = require('koa-router')();
//cookie设置
router
.get('/setCookie', async (ctx) => {
//不需要引入其他插件,直接使用就好
ctx.cookies.set('userid','12312',{
maxAge:60*60*1000, //设置多长时间后过期
//expires:'2018-12-01 00:00:00', //也用于设置过期时间,不过指定的是某一个具体的时间点
path:'/getCookie' //能够获取cookie的路径,默认是'/',全部路径
//domain:'', //能够获取cookie的域名
//secure:false, //true表示只有https协议可以访问
//httpOnly:true //是否只是服务器可以访问cookie,默认是true。false则前后端均可以去访问。
})
//koa中若设置的cookie值为中文,会报错。可以在存储的时候先将其转换为base64位字符进行存储,获取的时候再将其转换过来
ctx.cookies.set('userinfo',new Buffer('欢欢').toString('base64'),{
maxAge:60*60*1000
})
ctx.body = '设置cookie成功'
})
//cookie获取
.get('/getCookie', async (ctx) => {
var data = ctx.cookies.get('userid');
var userinfo = new Buffer(ctx.cookies.get('userinfo'), 'base64').toString() ;
ctx.body = '获取cookie' + userinfo + data;
})
//暴露路由
module.exports = router.routes();
数据库操作:
var router = require('koa-router')();
//引入封装好的操作数据库模块
var Mongo = require('../../module/db.js');
//操作数据库,处理用户信息
//查询
router
.get('/find',async (ctx) => {
//返回来的是一个Promise对象
var result = await Mongo.find('user',{});
await ctx.render('user/userList',{
list:result
});
})
//添加
.get('/add', async (ctx) => {
await ctx.render('user/add');
})
.post('/doAdd', async (ctx) => {
//获取post请求值
var addJson = ctx.request.body;
var data = await Mongo.insert('user',addJson);
if(data.result.ok == 1){
ctx.redirect('/admin/user/find');
}
})
//修改
.get('/edit', async (ctx) => {
var id = ctx.query.id;
var result = await Mongo.find('user',{_id:Mongo.getObjectId(id)});
await ctx.render('user/edit',{list:result[0]});
})
.post('/doEdit', async (ctx) => {
var editJson = ctx.request.body;
var data = await Mongo.update('user',{_id:Mongo.getObjectId(ctx.request.body.id)},editJson);
if(data.result.ok == 1){
ctx.redirect('/admin/user/find');
}
})
//删除
.get('/delete', async (ctx) => {
var id = ctx.query.id;
var data = await Mongo.delete('user',{_id:Mongo.getObjectId(id)});
if(data.result.ok == 1){
ctx.redirect('/admin/user/find');
}
})
//暴露路由
module.exports = router.routes();
art-template 模板语法
类ejs:
<h2>引入模板</h2>
<%include('../public/header.html')%>
<h2>输出</h2>
<p><%=ejsList.name%></p>
<h2>if语句</h2>
<%if(ejsList.age>20){%>
<p>大于20岁</p>
<%}else{%>
<p>小于等于20岁</p>
<%}%>
<h2>循环</h2>
<ul>
<%for(var i = 0; i < ejsList.manage.length; i++) {%>
<li><%=ejsList.manage[i]%></li>
<%}%>
</ul>
类ng:
<h2>引入模板</h2>
{{include '../public/header.html'}}
<h2>输出</h2>
{{ngList.name}}
<h2>if语句</h2>
{{if ngList.age>20}}
<p>大于20岁</p>
{{else}}
<p>小于等于20岁</p>
{{/if}}
<h2>循环</h2>
<ul>
{{each ngList.manage}}
<li>{{$value}}</li>
{{/each}}
</ul>
这儿代码比较混乱,我只粘贴了部分我以后可能会用的,具体的大家可以去git上下载查看。
https://github.com/zhangstar1331/koa-test.git