一.Koa2入门

  本来是想Express入门的,但是既然都是要学,干嘛不学最新的呢?
  其实我想说,我本来只是想学个小程序开发,现在已经陆陆续续开了好多坑了。。
  本文参考廖雪峰教程

二.Async
  最新的Koa2已经使用async来作为中间件(middleware)了,具体用法这里不赘述,可以参考阮一峰老师的Es6教程
  之前使用的Generator函数

  使用async时,要求node的版本大于等于7.6.0
  因此如果发现错误,可以使用nvm(window系统),n(mac系统)来切换node版本

  mac系统的n已经用的很多了,这里放出window系统下的nvm的一些介绍:下载nvm使用说明

三.实例
1. 使用npm init命令初始化package.json

2. 使用npm install --save-dev koa koa-bodyparser koa-router安装koa2
其中koa和koa-router毋庸置疑字面含义已经很清楚了,koa-bodyparser是因为无论是原生的node还是koa都无法直接解析request的body,因此需要引用这个插件

3. 在根目录创建文件夹:controllers,在该文件夹中保存所有的路由文件

4. 在controllers文件夹中新增一个名为index.js的文件,内容如下:

var fn_index = async (ctx, next) => {
// let appID = 'wx5db51f3c5c381ed2',
// appsecret = '4c797335101c71a01c1713b3f83fd26d',
// Token = 'xiaoyebaomemeda';
console.log(ctx.querystring);
ctx.response.body = `<h1>Index </h1><h3>koa1</h3><h4>${ctx.querystring}</h4>`;
}; var fn_hello = async (ctx, next) => {
var name = ctx.params.name;
ctx.response.type = 'text/html';
ctx.response.body = `<h3>Hello ${name}</h3>`;
}; module.exports = {
'Get /': fn_index,
'Get /hello/:name': fn_hello
};

可以看出,这个文件输出的对象中包含两个”路由“,分别是"Get /"和"Get /hello/:name"
  "Get"表示method是"get","/"是url路径
  关于ctx的介绍详见官网
5. 在controllers文件夹再新建一个名为user.js的文件,内容如下:

var fn_get_register = async (ctx, next) => {
var html = `
<!DOCTYPE html>
<html>
<head>
<title>register</title>
</head>
<body>
<form action="/register" method="post">
姓名:<input type="text" name='name' value=''>
年龄:<input type="" name="age">
<button type="submit">submit</button>
</form>
</body>
</html>
`;
ctx.response.type = 'text/html';
ctx.response.body = html;
}; var fn_post_register = async (ctx, next) => {
console.log(`name:${ctx.request.body.name}
age: ${ctx.request.body.age}`);
ctx.response.body = `<span>submited!</span>
name:${ctx.request.body.name}
age:${ctx.request.body.age}`;
}; module.exports = {
'Get /register': fn_get_register,
'Post /register': fn_post_register
};

  这次分别创建了"Get"和"Post"方法的路由

6.在根目录创建controller.js,用来读取controller文件夹中的所有路由文件,反射出路由,内容如下:

// 返回path路径下的所有js文件
var readFile = function (path) {
var fs = require('fs');
var files = fs.readdirSync('./'+path);
var jsFiles = files.filter((f) => {
return f.endsWith('.js');
});
return jsFiles;
}; // 根据.js文件反射路由
var SetRouter = function (path) {
// 声明路由
var router = require('koa-router')();
var jsFiles = readFile(path);
for (var js of jsFiles) {
let mapping = require(__dirname + '/' + path + '/' + js); //分别引入每个js文件
for (var url in mapping) {
// 遍历每个controller文件中的路由
if(url.startsWith('Get')) {
// method: get
router.get(url.replace('Get ',''), mapping[url]);
} else if (url.startsWith('Post'),mapping[url]) {
// method: post
router.post(url.replace('Post ',''), mapping[url]);
} else {
// 非路由的
console.log('this is not router file');
}
}
}
return router.routes();
}; module.exports = function (path) {
return SetRouter( path || 'controllers');
};

7.在根目录新建app.js,内容如下:

var Koa = require('koa');
var app = new Koa();
var router = require('./controller.js')();
var sha1 = require('sha1');
var bodyParser = require('koa-bodyparser'); app.use(async (ctx,next) => {
console.log(new Date());
await next ();
}); app.use(bodyParser());
app.use(router); app.listen(3000);
console.log('listening port 3000');

8.在命令行使用命令:node app.js即可启动服务

9.在浏览器输入:localhost:3000即可访问

输入如下URL,页面展示如下所示:

  输入注册URL,页面展示如下所示:

输入姓名和年龄,点"submit”,显示如下:

小结一下koa2安装:

1.使用npm init命令初始化package.json
2.使用npm install --save-dev koa koa-bodyparser koa-router安装koa2

3.koa2的官方文档资料详见http://www.koacn.com/#contexthttps://koa.bootcss.com/#

文章来源:https://www.imooc.com/article/18246

从入门到不放弃系列之Koa2的更多相关文章

  1. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  2. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  3. php从入门到放弃系列-01.php环境的搭建

    php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...

  4. php从入门到放弃系列-04.php页面间值传递和保持

    php从入门到放弃系列-04.php页面间值传递和保持 一.目录结构 二.两次页面间传递值 在两次页面之间传递少量数据,可以使用get提交,也可以使用post提交,二者的区别恕不赘述. 1.get提交 ...

  5. php从入门到放弃系列-03.php函数和面向对象

    php从入门到放弃系列-03.php函数和面向对象 一.函数 php真正的威力源自它的函数,内置了1000个函数,可以参考PHP 参考手册. 自定义函数: function functionName( ...

  6. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

  7. K8S从入门到放弃系列-(16)Kubernetes集群Prometheus-operator监控部署

    Prometheus Operator不同于Prometheus,Prometheus Operator是 CoreOS 开源的一套用于管理在 Kubernetes 集群上的 Prometheus 控 ...

  8. K8S 从入门到放弃系列文章目录(Kubernetes 1.14)

    1)软件环境 软件 版本 系统 Centos7.5 Kubernetes 1.14.1 Docker 18.09 Calico 3.6 Etcd 3.3.12 2)部署过程简单概要 三台master节 ...

  9. java从入门到卖肠粉系列

    java从入门到卖肠粉系列 注:本教程只是从JAVA基础开始,绝对不会跟公司有任何利益冲突,更不会出现一行公司项目的代码 QQ群:9547527 推荐用土豆,百度去上传太慢,百度云在线播放还要转码.. ...

随机推荐

  1. Spring的@ModelAttribute注解

    1. 一.绑定请求参数到指定对象 public String test1(@ModelAttribute("user") UserModel user) 只是此处多了一个注解@Mo ...

  2. Redis之序列化POJO

    redis存储方式有很多种,但是我个人觉得最好用的并非是String存储类型,而是Hash存储类型,如果在使用redis的时候单纯的只使用到String存储类型的话,我个人觉得完全体现不了redis的 ...

  3. Oracle SQL Trace 和 10046 事件

    http://blog.csdn.net/tianlesoftware/article/details/5857023 一. SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRAC ...

  4. 使用 X-Frame-Options 防止被iframe 造成跨域iframe 提交挂掉

     Refused to display 'http://www.***.com/login/doLogin.html' in a frame because it set 'X-Frame-Optio ...

  5. Nodejs异步框架——async

    上次的网页爬虫写完后,又打算做一个爬图的工具.前两天已经写好了代码.思路如下: 分析页面还是采用cheerio,对<div>中的img进行分析抽取,拿到图片的url.然后用childpro ...

  6. java 集合stream操作

    分组 Map<Integer, List<T>> group = List.stream().collect(Collectors.groupingBy(T::getField ...

  7. artdialog(4.1.7)弹出框

    artDialog弹出框 <link href="/js/artDialog/skins/default.css" rel="stylesheet" /& ...

  8. HI-LO计数法,赌桌,与机会

    HI-LO计数法,赌桌,与机会 “人只是在拼一种可能性”. 很多简单道理往往字面上理解容易,可实际运用难极. 一,那些人生中被扯的蛋 而关于人生的指导,好多耳熟能详的老话最终都被发现是蒙傻逼的.随便说 ...

  9. s11 day 102 python Linux环境安装 与路飞项目 微信平台接口

    1.微信公众号平台沙箱环境地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 二.结算中心业务 结算中心: -购物车,删 ...

  10. 删除 iptables nat 规则

    原文:https://www.cnblogs.com/hixiaowei/p/8954161.html 删除FORWARD 规则: iptables -nL FORWARD --line-number ...