- 安装koa npm i koa@2.0.0或者在packge.json文件 dependencies字段中加入 "koa":"2.0.0"字段,npm install 当前工程nodes_modules目录中会自动添加koa模块
- 新建app.js
- 在app.js中添加如下代码
<!--引入的koa模块是个class,所以首字母需要大写-->
const Koa =require('koa');
const app=new Koa();
app.use(async (ctx,next)=>{
console.log(`Process ${ctx.request.method} ${ctx.request.url} ....`);
<!--next()函数必须要有 会继续执行下一个use-->
await next();
});
app.use(async (ctx,next)=>{
const {path,body}=ctx.request;
if(path==='/test'){
body='Test page'
}else{
await next();
}
});
app.listen(3000);
console.log('app started at port 3000');
4.运行 node app.js ,在控制台上会显示出app started at port 3000
上述代码缺点:新增链接都会再app.js文件中添加,导致后续代码量越来越大,并且难以维护
- koa-router koa路由的作用是使url从代码中分离出来,单独维护,不需要在异步函数中进行判断,安装方式见1
<!--在上述代码的基础上添加-->
<!--(koa-router)返回的是函数-->
const router=require('koa-router')();
<!--改造app.use if(path==='/test')不需要在判断-->
router.get('/test',async (ctx,next)=>{
......
});
- 上述只适用于get方式,post方式需要在安装
koa-bodyparser
<!--在上述代码的基础上添加-->
<!--post请求-->
const bodyParser=require('koa=bodyparser');
<!--新增一个url-->
router.post('/signin',async (ctx,next)=>{
const {request,reponse}=ctx;
const {name,password}=request.body;
......
})
- 上述改造虽然使代码结构更加清晰,但是比没有解决最开始的app.js代码量过多的问题。要解决app.js代码量过多的问题,需要如下操作:
新建controllers.js文件,负责遍历在controller文件夹下的以.js结尾的文件,并且引入文件添加在router中
const fs = require('fs');
function addMapping(router, mapping) {
for (var url in mapping) {
if (url.startsWith('GET')) {
var path = url.substring(4);
router.get(path, mapping[url]);
console.log(`register url mapping:GET ${path}`);
} else if (url.startsWith('POST')) {
var path = url.substring(5);
router.post(path, mapping[url]);
console.log(`register URL mapping:POST ${path}`);
} else {
console.log(`invalid url:${url}`);
}
}
}
function addControllers(router) {
const files = fs.readdirSync(__dirname + '/controllers');
// 过滤出js文件
const js_files = files.filter(f => {
return f.endsWith('.js');
});
// 处理每个js文件
for (var f of js_files) {
console.log(`process controller:${f}`);
// 引入js文件
let mapping = require(__dirname + '/controllers/' + f);
addMapping(router, mapping);
}
}
module.exports = function(dir) {
let controllers_dir = dir || 'controllers',
router = require('koa-router')();
addControllers(router, controllers_dir);
return router.routes();
}
新建controller文件夹,js文件主要是异步处理函数
const fn_index=async (ctx,next)=>{
ctx.response.body = `<h1>Index</h1>
<form action='/signin' method='post'>
<p>Name:<input name='name' value='koa'/></p>
<p>Password:<input name='password' type='password'/></p>
<p><input type='submit' value='submit'/></p>
</form>`;
};
const fn_signin=async (ctx,next)=>{
const { request, response } = ctx;
const { name, password } = request.body;
console.log(`sigin with name:${name},password:${password}`);
if (name === 'koa' && password === '12345') {
response.body = `<h1>Welcome,${name}</h1>`;
} else {
response.body = `<h1>Login failed!</h1>
<p><a href='/'>Try again</a></p>`;
}
};
const fn_hello=async (ctx,next) =>{
const name=ctx.params.name;
ctx.response.body=`<h1>Hello,${name}!</h1>`;
}
module.exports={
'GET /':fn_index,
'POST /signin':fn_signin,
'GET /hello/:name':fn_hello
};
- 至此拆分结束 运行node app.js
- git详细代码地址 https://github.com/jdkwky/webstudydeep/tree/webstudydeep/hello-koa
==参考:廖雪峰nodejs教程==