🌟前言
哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们继续带大家了解Node的框架 Koa ;让我们一起来看看吧🤘
🌟开发框架
🌟应用程序
🌟应用程序Koa类
Koa 应用程序是一个包含一组中间件函数的对象(app),在一个应用中,只需要实例化一个,它是按照类似堆栈的方式组织和执行的。
const Koa = require('koa'); const app = new Koa();
当我们安装了koa这个框架后,require该框架,我们可以得到一个Koa类,实例化这个类我们可以得到一个 app 实例对象。
🌟应用对象(app)的方法
方法 | 描述 |
app.use(function) | 将给定的中间件方法添加到此应用程序。app.use() 返回 this, 因此可以链式调用. |
app.listen(…) | 创建并返回 HTTP 服务器,将给定的参数传递给 Server#listen()。 |
🌟app.use(function)
app.use(function) 将给定的中间件方法添加到此应用程序。app.use() 返回 this, 因此可以链式调用.
基本使用:
app.use(async (ctx, next) => { const start = Date.now(); await next(); // 进入下一个中间件执行,执行结束后继续执行后续代码 const ms = Date.now() - start; ctx.set('X-Response-Time', `${ms}ms`); });
链式调用:
app.use(someMiddleware) app.use(someOtherMiddleware) app.listen(3000)
等同于
app.use(someMiddleware) .use(someOtherMiddleware) .listen(3000)
🌟app.listen(…)
Koa 应用程序不是 HTTP 服务器的1比1实现。 可以将一个或多个 Koa 应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序。
创建并返回 HTTP 服务器,将给定的参数传递给 Server#listen()。
以下是一个无作用的 Koa 应用程序被绑定到 3000 端口:
const Koa = require('koa'); const app = new Koa(); app.listen(3000);
这里的 app.listen(...)
方法只是以下方法的语法糖:
const http = require('http'); const Koa = require('koa'); const app = new Koa(); http.createServer(app.callback()).listen(3000);
这意味着您可以将同一个应用程序同时作为 HTTP
和 HTTPS
或多个地址:
const http = require('http'); const https = require('https'); const Koa = require('koa'); const app = new Koa(); http.createServer(app.callback()).listen(3000); https.createServer(app.callback()).listen(3001);
🌟应用程序设置
应用程序设置是 app 实例上的属性,目前支持如下:
app.env 默认是 NODE_ENV 或 "development"
app.keys 签名的 cookie 密钥数组
app.proxy 当真正的代理头字段将被信任时
忽略 .subdomains 的 app.subdomainOffset 偏移量,默认为 2
app.proxyIpHeader 代理 ip 消息头, 默认为 X-Forwarded-For
app.maxIpsCount 从代理 ip 消息头读取的最大 ips, 默认为 0 (代表无限)
可以将设置传递给构造函数:
const Koa = require('koa'); const app = new Koa({ proxy: true });
或动态的:
const Koa = require('koa'); const app = new Koa(); app.proxy = true;
🌟上下文(Context)
Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。
每个请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符,如以下代码片段所示:
app.use(async ctx => { ctx; // 这是 Context ctx.request; // 这是 koa Request ctx.response; // 这是 koa Response });
为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.request
或 ctx.response
,不然的话它们是相同的。 例如 ctx.type
和 ctx.length
委托给 response
对象,ctx.path
和 ctx.method
委托给 request
。
🌟路由
所谓的路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源。
🌟koa-router
koa-router 是 koa 的一个路由中间件,它可以将请求的URL和方法(如:GET 、 POST 、 PUT 、 DELETE 等) 匹配到对应的响应程序或页面。可以把路由分发到各个文件里,起到分层的作用。
🌟安装
$ npm install --save koa-router
🌟Router类
创建一个路由对象:
var router = new Router([opts])
参数:
🌟router.prefix(prefix)
为已经初始化的路由器实例设置路径前缀
router.prefix(prefix) => Router
示例:
// 初始化路由实例 const router = new Router() // 设置路径前缀 router.prefix("/users"); router.get("/", ctx => { ctx.body = ctx.url; }); router.get("/:id", ctx => { ctx.body = ctx.params; }); // 注册路由中间件 app.use(router.routes()).use(router.allowedMethods());
🌟router.routes()
router.routes() => Function
返回分配给与请求匹配的路由的路由器中间件。
router.allowedMethods([options])
router.allowedMethods([options]) => Function
返回单独的中间件函数, 用于处理响应选项请求, 其中包含允许的方法和运行的头部字段。
示例:
const Koa = require("koa"); const Router = require("@koa/router"); const app = new Koa(); const router = new Router(); app.use(router.routes()); app.use(router.allowedMethods());
router.redirect(source, destination, [code])
router.redirect(source, destination, [code]) => Router
用可选的 30x 状态代码重定向 source
到 destination
路径。source
和 destination
都可以是路由名称。
// 初始化路由实例 const router = new Router(); router.get("/", ctx => { ctx.body = "Hello"; }); router.get("about", "/about", ctx => { ctx.body = "重定向到了这里"; }); router.redirect("/user", "about"); // 注册路由中间件 app.use(router.routes()).use(router.allowedMethods());
🌟基本使用
const Koa = require('koa'); const Router = require('koa-router'); // 实例化Koa对象 => app const app = new Koa(); // 实例化路由对象 => router const router = new Router(); // 对于任何请求,app将调用该异步函数处理请求: app.use(async (ctx, next) => { console.log(`Process ${ctx.request.method} ${ctx.request.url}...`); await next(); }); router.get('/', async (ctx, next) => { ctx.response.body = `<h1>Hello, Koa2</h1>`; }); router.get('/hello/:name', async (ctx, next) => { let name = ctx.params.name; ctx.response.body = `<h1>Hello, ${name}</h1>` }); app.use(router.routes()) .use(router.allowedMethods()); // 在端口3000监听: app.listen(3000); console.log('app started at port 3000...');
🌟请求方式
koa-router 请求方式: get 、 put 、 post 、 delete 、 del ,而使用方法就是 router.METHOD() ,比如 router.get() 和 router.post() 。而 router.all()会匹配所有的请求方法。
router.METHOD(path,[middleware],callback) => Router
当匹配成功就会执行回调函数。
Param | Type | Description |
path | String | |
[middleware] | function | 路由中间件列表 |
callback | function | 路由匹配成功回调函数 |
router.get('/', async (ctx, next) => { ctx.response.body = `<h1>Hello, Koa2</h1>`; }); router.post('/', async (ctx, next) => { ctx.response.body = `<h1>Hello, Koa2</h1>`; });
🌟路由参数
路由参数是客户端通过URL传递参数的一种方式。可以将URL中的指定参数捕获到并填充到ctx.params对象中,URL中的指定参数的名称作为ctx.params的各自的键名。
访问连接:localhost:3000/users/100
router.get("/users/:id", ctx => { ctx.body = ctx.params; // {id:100} });
🌟设置路由前缀
在实例化 Router 的时候可以设置路由前缀,之后匹配的请求都会自动添加这个前缀。
访问链接:localhost:3000/user/string
const router = new Router({ //设置前缀 prefix: '/user' }); //匹配链接 localhost:3000/user/string router.get('/string', async (ctx, next) => { ctx.body = 'user' })
注意:如果prefix以/结尾,则路由的注册就可以省去前缀的/了,不然会出现/重复的情况
🌟路由模块化
当项目的路由太多时,在app.js文件过多的注册路由不便于开发与维护,可以创建模块化、可安装的路由处理程序。
在 app 目录下创建一个名为 routes 的目录并创建 users.js文件,该文件内容如下:
const router = require('koa-router')() router.prefix('/users') router.get('/', function (ctx, next) { ctx.body = 'this is a users response!' }) router.get('/bar', function (ctx, next) { ctx.body = 'this is a users/bar response' }) module.exports = router
然后,在应用程序中加载路由器模块:
const users = require('./routes/users') // ... app.use(users.routes(), users.allowedMethods())
🌟写在最后
更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!