安装:npm i koa --save / cnpm i koa --save
koa项目生成器
安装
npm i -g koa-generator
创建项目
koa2 项目名称
//导入koa框架
const koa = require('koa')
//创建服务器对象
const app =new koa()
//中间配置
app.use(async (etx)=>{ //把req,res都封装成etx
etx.body='你好 koa2' //响应数据的格式
})
//对比express框架
//app.use((req,res,next)=>{
//res.send('你好express')
//})
//监听端口
app.listen(3000)
console.log('服务器启动成功')
//安装
cnpm i koa-router --save / npm i koa-router
//导入并实例化
const router = require('koa-router')()
router.get('/',async (etx)=>{
etx.body = '首页'
}).get('/news',async (etx)=>{
etx.body='新闻页面'
})
//启动路由
app
.use(router.routes())
.use(router.allowedMethods)
/*
在koa2中GET传值通过request接收 但是接收的方法有两种query和querystring
query返回的是格式化好的参数对象
querystring返回的是请求的字符串
*/
router.get('/newsDetail', async (etx, next) => {
console.log(etx.query)
console.log(etx.querystring)
//在etx中有个request对象,也可以拿到参数,其实就是express中req,包含了请求的信息
console.log(etx.request.query)
console.log(etx.request.querystring)
etx.body = '新闻详情页面'
})
/*
动态路由
接收:etx.params
*/
//动态路由
router.get('/newsDetail/:id', async (etx, next) => {
console.log(etx.params)
const id = etx.params['id']
etx.body = '新闻详情页面' + id
})
//可以接受多个动态参数
router.get('/newsDetail/:id/:aid', async (etx, next) => {
console.log(etx.params)
const id = etx.params['id']
etx.body = '新闻详情页面' + id
})
//匹配路由前的中间件,第一个参数不加默认拦截所有路由,满足条件就next放行
app.use(async (etx, next) => {
console.log(new Date())
await next() //向下执行
})
//路由级中间件
router.get('/news', async (etx, next) => {
etx.body = '新闻页面1'
await next() //放行
})
//这个路由才会被匹配到
router.get('/news', async (etx, next) => {
etx.body = '新闻页面'
})
//引入koa框架
let Koa = require('koa')
let Router = require('koa-router')
//创建网站服务器
let app = new Koa()
//创建路由实例对象
let router = Router()
/*
错误处理中间件
不管放在路由的下面还是路由的上方都会首先执行中间件
express执行顺序是从上往下依次执行
当处理完之后返回来处理中间件next()后面的内容
就像洋葱一样
request一层一层往里走,走完之后response一层层往外走
就相当于先进后出
最先匹配到的中间件,他next后面的内容最晚执行
*/
router.get('/', async (etx, next) => {
etx.body = '首页'
})
router.get('/news', async (etx, next) => {
console.log('匹配到news路由')
etx.body = '新闻页面'
})
//动态路由
router.get('/newsDetail/:id/:aid', async (etx, next) => {
console.log(etx.params)
const id = etx.params['id']
etx.body = '新闻详情页面' + id
})
//放在路由下面也会比路由先执行
app.use(async (etx,next)=>{
console.log('这是一个错误处理中间件1')
await next()
if(etx.status == 404){
etx.status = 404
etx.body='Not Found'
}else{
console.log('1')
}
})
app.use(async (etx,next)=>{
console.log('这是一个错误处理中间件2')
await next()
if(etx.status == 404){
etx.status = 404
etx.body='Not Found'
}else{
console.log('2')
}
})
app
.use(router.routes()) //启动路由
.use(router.allowedMethods())
app.listen(3000)
console.log('服务器启动成功')
/*
第三方中间件
配置模板引擎
1.下载koa-views插件
cnpm i koa-views --save
2.下载ejs模板引擎
cnpm i ejs --save
3.导入koa-views模块
const views = require('koa-views)
4.使用中间件配置模板引擎
配置1:app.use(views('views',{extension:'ejs}))//告诉模板引擎的位置和使用哪个模板引擎
配置2:app.use(views('views',{map:{html:'ejs'}}))//这样配置views中的模板后缀名要是html
*/
//导入koa模板引擎
let views = require('koa-views')
//第三方中间,模板引擎的位置
app.use(views('views',{extension:'ejs'}))//告诉模板引擎的位置和使用哪个模板引擎
//导入公共模板
<%- include ('common/header.ejs') %>
//循环
<%for(let i =0;i < arr.length;i++){%>
<li><%=arr[i]%></li>
<%}%>
//解析html語句
<%- %>
<%- comment%>
//条件判断
<%if(age >= 18){%>
<h3>可以访问此网站</h3>
<%}else{%>
<h3>未成年禁止访问</h3>
<%}%>
原生js获取post和get
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const fs = require('fs');
let users = {};
let server = http.createServer(function(req,res){
// console.log('请求来了',req.url);
// console.log(req.method);
let path ='',get={},post={};
if(req.method == 'GET'){
let {pathname,query}=url.parse(req.url,true);
path=pathname;
get=query;
complete();
}else if(req.method == "POST"){
path=req.url;
let arr = [];//定义一个空数组
req.on('data',buffer=>{
// console.log(buffer);//返回的是二进制形式
arr.push(buffer);//把返回的二进制追加到数组里面
});
req.on('end',()=>{
let buffer = Buffer.concat(arr);
// console.log(buffer.toString());
post = querystring.parse(buffer.toString());
// console.log(query);
complete();
});
}
function complete(){
// console.log(path,get,post);
if(path == '/reg'){
let {username,password} = get;
if(users[username]){
console.log('用户名已存在,用户名:',users[username],'密码',password);
}
if(users[username]){//如果user里面有这个username就报错
res.write(JSON.stringify({error:1,msg:"此用户已存在"}));//只能是字符串,所以用json的方法
res.end();
}else{//如果没有这个用户就把这个密码赋给这个用户
users[username] = password;
res.write(JSON.stringify({error:0,msg:''}));
res.end();
}
}else if(path == '/login'){
let {username,password}=get;
if(users[username]){
console.log('用户名:',users[username],'密码',password);
}
if(!users[username]){
res.write(JSON.stringify({error:1,msg:'找不到此用户'}));
res.end();
}else