文章目录
- 🌟前言
- 🌟开发框架
- 🌟应用程序
- 🌟应用程序Koa类
- 🌟应用对象(app)的方法
- 🌟app.use(function)
- 🌟app.listen(...)
- 🌟应用程序设置
- 🌟上下文(Context)
- 🌟路由
- 🌟koa-router
- 🌟安装
- 🌟Router类
- 🌟router.prefix(prefix)
- 🌟router.routes()
- 🌟基本使用
- 🌟请求方式
- 🌟路由参数
- 🌟设置路由前缀
- 🌟路由模块化
- 🌟写在最后
🌟前言
哈喽小伙伴们,新的专栏 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
。
属性名 | 描述 |
---|---|
ctx.req | Node 的 request 对象. |
ctx.res | Node 的 response 对象. |
ctx.request | koa 的 Request 对象. |
ctx.response | koa 的 Response 对象. |
ctx.state | 推荐的命名空间,用于通过中间件传递信息和你的前端视图。ctx.state.user = await User.find(id); |
ctx.app | 应用程序实例引用 |
ctx.cookies.get(name, [options]) | 通过 options 获取 cookie name |
ctx.cookies.set(name, value, [options]) | 通过 options 设置 cookie name 的 value |
ctx.throw([status], [msg], [properties]) | 用来抛出一个包含 .status 属性错误的帮助方法,其默认值为 500。这样 Koa 就可以做出适当地响应。 |
🌟路由
所谓的路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源。
🌟koa-router
koa-router
是 koa
的一个路由中间件,它可以将请求的URL和方法(如:GET 、 POST 、 PUT 、 DELETE 等) 匹配到对应的响应程序或页面。可以把路由分发到各个文件里,起到分层的作用。
🌟安装
$ npm install --save koa-router
🌟Router类
创建一个路由对象:
var router = new Router([opts])
参数:
Param | Type | Description |
---|---|---|
[opts] | Object | 可选参数,路由配置对象 |
[opts.prefix] | String | 设置路由前缀,之后匹配的请求都会自动添加这个前缀 |
[opts.methods] \Array[String] | 默认设置为[‘HEAD’,‘OPTIONS’,‘GET’,‘PUT’,‘PATCH’,‘POST’,‘DELETE’] 设置路由可以支持的METHOD | |
router对象方法 |
方法 | 描述 |
---|---|
router.prefix(prefix) | 为已经初始化的路由器实例设置路径前缀 |
router.routes() | 返回分配给与请求匹配的路由的路由器中间件 |
router.allowedMethods([options]) | 返回单独的中间件函数, 用于处理响应选项请求, 其中包含允许的方法和运行的头部字段。 |
router.redirect(source, destination, [code]) | 用可选的 30x 状态代码重定向 source 到 destination 路径。 |
router.use([path], middleware) | 给路由绑定中间件 |
🌟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!
✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!