扣丁书屋

koa2入门使用总结

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

koa2的介绍

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

koa2安装

npm install koa
koa middleware

每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数 middleware的顺序很重要,也就是调用app.use()的顺序决定了middleware的顺序

对于await next(),如果一个middleware没有调用,则后续的middleware将不再执行了,使用场景 如,一个检测用户权限的middleware可以决定是否继续处理请求,还是直接返回403错误

app.use(async (ctx, next) => {
    if (await checkUserPermission(ctx)) {
        await next();
    } else {
        ctx.response.status = 403;
    }
});

ctx简写: ctx.url相当于ctx.request.url,ctx.type相当于ctx.response.type

url处理 ,使用koa-router

安装koa-router:

npm install koa-router

注意require('koa-router')返回的是函数:

const router = require('koa-router')();

这里导入koa-router的语句最后的()是函数调用

const router = require('koa-router')();

相当于

const fn_router = require('koa-router');
const router = fn_router();

添加路由:

router.get('/hello/:name', async (ctx, next) => {
    var name = ctx.params.name;
    ctx.response.body = `<h1>Hello, ${name}!</h1>`;
});

router.get('/', async (ctx, next) => {
    ctx.response.body = '<h1>Index</h1>';
});

// add router middleware:
app.use(router.routes());

这样我们在访问 http://localhost:3000/hello/kerry 时会打印hello,kerry

处理post请求

post请求通常会发送一个表单,或者JSON,它作为request的body发送,但无论是Node.js提供的原始request对象,还是koa提供的request对象,都不提供解析request的body的功能,所以我们需要用到koa-bodyparser中间件来解析request的body

安装koa-bodyparser

npm install koa-bodyparser

使用koa-bodyparser:

const bodyParser = require('koa-bodyparser');

// 解决body 需在router之前注册到app对象上
app.use(bodyParser());

这样我们就可以处理post请求了

router.get('/', 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>`;
});

router.post('/signin', async (ctx, next) => {
    var
        name = ctx.request.body.name || '',
        password = ctx.request.body.password || '';
    console.log(`signin with name: ${name}, password: ${password}`);
    if (name === 'koa' && password === '12345') {
        ctx.response.body = `<h1>Welcome, ${name}!</h1>`;
    } else {
        ctx.response.body = `<h1>Login failed!</h1>
        <p><a href="/">Try again</a></p>`;
    }
});

代码优化

所有的代码都放在了app.js中 我们可以单独将所有路由放到一个js文件中,如果是复杂系统,还可以按模块建立多个路由文件,如 user.js(处理用户管理相关url)、login.js(处理用户登录相关url)

静态资源

安装koa-static

npm install koa-static
const static = require('koa-static')
const path = require('path')

使用静态资源目录

app.use(static(
  path.join( __dirname,'./static')
));

我们在根目录下建立static文件夹,新建一个json文件,输入如下地址访问

http://localhost:3000/china.geojson

art-template模板引擎

npm install --save art-template
npm install --save koa-art-template

// 模板引擎

const render = require('koa-art-template');

render(app, {
  root: path.join(__dirname, './static'),
  extname: '.html',
  // debug: process.env.NODE_ENV !== 'production'
});

// 使用ctx.render渲染页面 可传递数据
router.get('/user', async (ctx, next) => {
    ctx.render('user',{
            data:'hello msg'
    });
});

html中渲染数据 {{data}}

更多用法查看

koa2 跨域请求设置

https://github.com/zadzbw/koa2-cors
npm install --save koa2-cors

var cors = require('koa2-cors');
app.use(cors());

开发与部署

1、 项目搭建好后,通过node运行

node app.js

也可以在package.json中添加scripts

"scripts": {
    "start": "node app.js"
}

这样就可以运行 npm run start,然后访问 http://localhost:3000

2、 通过nodemon来运行项目

先安装nodemon:

npm install -g nodemon

之后用 nodemon 来代替 node 来启动应用,如下所示:

nodemon app.js

3、 如果是在线上 我们则使用pm2来管理应用程序

pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,可以参考:https://www.cnblogs.com/lxg0/p/7771229.html

SHELL快速入门

shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。

发布于:4月以前  |  264次阅读  |  详细内容 »

移动设备怎样定位

解释说明移动设备的定位原理

发布于:4月以前  |  274次阅读  |  详细内容 »

node-sass在Mac下安装失败(下载失败)的解决方案

使用命令`npm install node-sass --save-dev` 在 mac下无法安装的解决方案

发布于:9月以前  |  426次阅读  |  详细内容 »

px、em、rem区别

本文通过说明px,em,rem的关系,指导如何使用字体单位。

发布于:9月以前  |  347次阅读  |  详细内容 »

rm -rf * 删除操作报 “Argument list too long”的处理方法

当目录下有很多文件时,`rm *`删除文件会失败。

发布于:9月以前  |  333次阅读  |  详细内容 »

使用olivere对ElasticSearch进行简单搜索

使用github.com/olivere/elastic进行简单搜索。

发布于:9月以前  |  739次阅读  |  详细内容 »

使用"github.com/olivere/elastic"操作Elasticsearch的简单示例

github.com/olivere/elastic的简单示例,包括增,删,改,查。

发布于:9月以前  |  1428次阅读  |  详细内容 »

罗振宇2017-2018跨年演讲::中国式机会的六个“脑洞”

“时间的朋友”2017年罗振宇跨年演讲如约而至。罗振宇从一个问题开启,对你来说,2017年哪一天你认为很重要?

发布于:9月以前  |  609次阅读  |  详细内容 »

罗振宇2018-2019跨年演讲:黑天鹅、小趋势、5G、人工智能、创新......

2018年12月31日20:30,深圳“春茧”体育馆,罗振宇2018“时间的朋友”跨年演讲如约而至。

发布于:9月以前  |  555次阅读  |  详细内容 »

罗振宇2020-2021跨年演讲:中国的优势、数字化、新变量……

2020年12月31日20:30,武汉光谷国际网球中心,罗振宇“时间的朋友”跨年演讲如约而至。

发布于:9月以前  |  972次阅读  |  详细内容 »

最多阅读

html <table>表数据转 Json 格式 2年以前  |  2487次阅读
使用 Vue 3.0,你可能不再需要Vuex了 1年以前  |  1420次阅读
element中input的change事件 1年以前  |  1253次阅读
Vue表单支持回车键自动提交 1年以前  |  1244次阅读
2020 Vue经典面试题 1年以前  |  1177次阅读
VS Code 配置与插件推荐 2019 年版 1年以前  |  1140次阅读
koa2入门使用总结 1年以前  |  1131次阅读
Vue如何实现疫情地图展示 1年以前  |  1108次阅读

手机扫码阅读