koa使用方法汇总

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

猜你喜欢

转载自blog.csdn.net/weixin_40970987/article/details/84315378