1. Введение
Koa - это фреймворк для веб-разработки нового поколения, основанный на платформе nodeJs, созданный исходной командой Express, и стремится стать более компактной, более выразительной и надежной веб-фреймворком. Используя koa для написания веб-приложений, комбинируя разные генераторы, вы можете избежать повторяющихся и утомительных вложений функций обратного вызова и значительно повысить эффективность обработки ошибок. Koa не связывает какое-либо промежуточное программное обеспечение в методе ядра, он только предоставляет легкую и элегантную библиотеку функций, которая упрощает написание веб-приложений. В настоящее время существует две основные версии 1.x и 2.x. Версия 2.x использует сахар синтаксиса async await, поддерживаемый после Node.js v7.6.0, обеспечивая более элегантную модель асинхронного программирования.
2. Основная концепция Коа
Что именно делает Коа? Самая важная и основная вещь в Koa - это реализация обработки протокола http. У него есть три основных концепции:
- Koa Application: основная программа
- Контекст: контекст
- Запрос, ответ: запрос и ответ
Три, базовое использование
【1】 Подготовка
// 1.Koa必须使用7.6以上的node版本,检查node版本,低于要求的话就升级node
$ node -v
// 2.创建一个 my_koa 文件夹,生成package.json文件
$ npm init -y
// 3.安装koa依赖
$ npm install --save koa
[2] Написать код
Создайте файл записи index.js в папке my_koa, а затем мы используем koa для настройки службы http.
// index.js文件
const Koa = require('Koa'); // 引入Koa
const app = new Koa(); // 创建Koa实例,定义Application
// 使用use方法来处理上下文
app.use(async ctx => {
// ctx是包含整个应用的上下文,可以对用户的请求做一些处理
ctx.body = 'hello, World!'
});
app.listen(3000); // 设置端口号,让Koa应用运行在3000端口上
После записи приведенного выше кода в файл index.js откройте терминал в каталоге файлов и введите node index.js, чтобы запустить файл.
Затем откройте браузер и введите: localhost: 3000, вы увидите результаты, которые мы выводим.
Четыре, приложение (приложение)
Приложение Koa - это объект, содержащий набор функций промежуточного программного обеспечения, которые организованы и выполняются в виде стека. Koa похож на многие другие системы промежуточного программного обеспечения, с которыми вы, возможно, столкнулись.
[1] app.listen () : привяжите сервер порта как запись программы, и можно связать несколько. Ниже приведено бесполезное приложение Koa, привязанное к 3000
порту.
const Koa = require('koa');
const app = new Koa();
app.listen(3000);
// app.listen(3000)是以下方法的语法糖
const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
[2] app.use (function) : добавить данный метод промежуточного программного обеспечения в это приложение, app.use () возвращает его, чтобы его можно было выразить в цепочке
app.use(someMiddleware)
app.use(someOtherMiddleware)
app.listen(3000)
// 等同于
app.use(someMiddleware).use(someOtherMiddleware).listen(3000)
[3] app.keys =: установить подписанный ключ cookie
app.keys = ['im a newer secret', 'i like turtle'];
app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');
[4] app.context: прототип, из которого создается ctx. Вы можете добавить другие атрибуты для ctx, отредактировав app.context
app.context.db = db();
app.use(async ctx => {
console.log(ctx.db);
});
[5] Обработка ошибок: добавить прослушиватель событий «ошибка».
app.on('error', (err, ctx) => {
log.error(err, ctx)
});
[6] next (): функция приостанавливает работу и передает управление следующему определенному промежуточному программному обеспечению.
const Koa = require('Koa'); // 引入Koa
const app = new Koa(); // 创建Koa实例,定义Application
const one = (ctx, next) => {
console.log('进 one');
next();
console.log('出 one');
}
const two = (ctx, next) => {
console.log('进 two');
next();
console.log('出 two');
}
const three = (ctx, next) => {
console.log('进 three');
next();
console.log('出 three');
}
app.use(one);
app.use(two);
app.use(three)
app.listen(3000)
Пятый, контекст (контекст)
Koa предоставляет объект Context, который представляет контекст разговора. Объект Context инкапсулирует объект HTTP-запроса (запроса) узла и объект HTTP-ответа (ответа) в один объект. Обрабатывая этот объект, вы можете управлять содержимым, возвращаемым пользователю.
[1] Контекстно-зависимые методы
- ctx.req: объект запроса узла
- ctx.res: объект ответа узла
- ctx.request: объект запроса Коа
- ctx.response: объект ответа Коа
- ctx.state: Рекомендуемое пространство имен, используемое для передачи информации и внешнего вида через промежуточное ПО.
- ctx.app: ссылка на экземпляр приложения
- ctx.cookies.get (имя, [параметры]) : 获取 cookie
- ctx.cookies.set (имя, значение, [параметры]) : 设置 cookie
- ctx.throw ([status], [msg], [properties]): выбросить исключение
- ctx.assert (значение, [статус], [сообщение], [свойства]): выдает ошибку
Шесть, запрос (запрос)
Объект Koa Request представляет собой абстракцию поверх собственного объекта запроса узла и предоставляет множество функций, полезных для разработки HTTP-сервера.
- request.header: объект заголовка запроса, который может быть установлен и назначен (request.header = xxx)
- request.headers: объект заголовка запроса, псевдоним request.header, может быть установлен и назначен (request.headers = xxx)
- request.method: метод запроса, вы можете установить назначение (request.method = xxx)
- request.length: возвращает запрошенную Content-Length в виде числа или неопределенного значения.
- request.url: получить URL-адрес запроса, вы можете установить URL-адрес запроса, который полезен для перезаписи URL-адреса (request.url = xxx)
- request.originalUrl: получить исходный URL-адрес запроса
- request.origin: получить источник URL, включая протокол и хост
- request.href: получить полный URL-адрес запроса, включая протокол, хост и URL-адрес.
- request.path: получить имя пути запроса, вы можете установить значение и сохранить строку запроса, если она существует (request.path = xxx)
- request.querystring: согласно?, чтобы получить исходную строку запроса, вы можете установить исходную строку запроса (request.querystring = xxx)
- request.search: используйте?, чтобы получить исходную строку запроса, вы можете установить исходную строку запроса (request.search = xxx)
-
request.host: получить хост, если он существует
-
request.hostname: получить имя хоста, если оно существует
-
request.URL: получить объект URL, проанализированный WHATWG
-
request.type: получить Content-Type запроса, исключая charset и другие параметры.
-
request.charset: получить запрошенный набор символов, если он существует, или не определен.
-
request.query: получить проанализированную строку запроса, когда нет строки запроса, вернуть пустой объект, вы можете установить назначение (request.query = xxx)
-
request.fresh: проверьте, является ли кеш запросов «свежим», то есть содержимое не изменилось. Этот метод используется для кэширования согласования между If-None-Match / ETag и If-Modified-Since и Last-Modified. Его следует указывать после установки одного или нескольких из этих заголовков ответа.
-
request.stale: противоположность request.fresh
-
request.protocol: возвращает протокол запроса, https или http.
-
request.secure: используйте ctx.protocol == "https", чтобы проверить, отправляется ли запрос через TLS.
-
request.ip: запросить удаленный адрес
Семь, Ответ (ответ)
Объект Koa Response представляет собой абстракцию поверх собственного объекта ответа узла и предоставляет множество функций, полезных для разработки HTTP-сервера.
- response.header: объект заголовка ответа
- response.headers: объект заголовка ответа, псевдоним response.header
- response.socket: сокет ответа
- response.status: получить статус ответа. По умолчанию response.status имеет значение 404 вместо 200 в качестве res.statusCode узла, а статус ответа задается числовым кодом (response.status = xxx).
- response.message: получить сообщение о статусе ответа. По умолчанию response.message связан с response.status, и для сообщения о статусе ответа можно задать заданное значение (response.message = xxx).
- response.length: возвращает Content-Length ответа в виде числа, или выводится из ctx.body, или undefined, вы можете установить Content-Length ответа на заданное значение (response.length = xxx)
- response.body: получить тело ответа, вы можете установить тело ответа на запись строки, запись буфера, конвейер потока, JSON-строковую привязку объекта || массив, нулевой ответ без содержимого
- response.type: получить Content-Type ответа, исключая "charset" и другие параметры, вы можете установить Content-Type ответа через строку mime или расширение файла (response.type = xxx)
[1] Типы HTTP-ответа
Тип возврата по умолчанию для Koa - text / plain (простой текст). Если вы хотите вернуть другие типы контента, вы можете использовать ctx.request.accepts, чтобы определить, какие данные клиент хочет принять (в соответствии с полем Accept HTTP-запроса Затем используйте ctx.response.type, чтобы указать тип возвращаемого значения.
const Koa = require('koa')
const app = new Koa()
const main = (ctx, next) => {
if (ctx.request.accepts('json')) {
ctx.response.type = 'json';
ctx.response.body = { data: 'Hello World' };
} else if (ctx.request.accepts('html')) {
ctx.response.type = 'html';
ctx.response.body = '<p>Hello World</p>';
} else if (ctx.request.accepts('xml')) {
ctx.response.type = 'xml';
ctx.response.body = '<data>Hello World</data>';
} else {
ctx.response.type = 'text';
ctx.response.body = 'Hello World';
};
}; //直接运行页面中会显示json格式,因为我们没有设置请求头,所以每一种格式都是ok的。
app.use(main) //app.use(function)用来加载中间件。
app.listen(3000)
8. Промежуточное ПО
【1. Введение
Самая большая особенность koa - это уникальное управление процессом промежуточного программного обеспечения, которое представляет собой знаменитую «луковицу». Мы можем ясно видеть, что запрос проходит через промежуточное программное обеспечение слой за слоем снаружи внутрь и изнутри в ответ, когда Просмотрите промежуточное ПО слой за слоем. Так же, как когда мы вставляем зубочистку в лук, зубочистка проходит сквозь слои луковой кожуры снаружи внутрь, чтобы достичь «лукового сердца». Когда мы вытаскиваем его, зубочистка проходит через слой луковой кожуры со стороны лука. изнутри наружу.
【2】 Чехол
По сути, все функции Koa реализуются через промежуточное программное обеспечение. Каждое промежуточное программное обеспечение по умолчанию принимает два параметра: первый параметр - это объект контекста, а второй параметр - это следующая функция. Пока вызывается следующая функция, право выполнения может быть передано следующему промежуточному программному обеспечению. Если следующая функция не вызывается внутри промежуточного программного обеспечения, право выполнения не будет передано. Функции промежуточного программного обеспечения1, промежуточного программного обеспечения2 и промежуточного программного обеспечения3 в следующем коде называются «промежуточным программным обеспечением» (промежуточным программным обеспечением), поскольку они находятся в середине HTTP-запроса и HTTP-ответа и используются для реализации некоторых промежуточных функций. app.use () используется для загрузки промежуточного программного обеспечения
const Koa = require('Koa');
const app = new Koa();
// 定义三个中间件的方法:middleware1、middleware2、middleware3,next()方法代表执行完当前中间件方法后,继续执行后面的方法
const middleware1 = function async(ctx, next) {
console.log('这是第一条middleware');
next();
console.log('这是第一条next之后的打印')
}
const middleware2 = function async(ctx, next) {
console.log('这是第二条middleware');
next();
console.log('这是第二条next之后的打印')
}
const middleware3 = function async(ctx, next) {
console.log('这是第三条middleware');
next();
console.log('这是第三条next之后的打印')
}
// 使用中间件方法
app.use(middleware1)
app.use(middleware2)
app.use(middleware3)
app.listen(5000)
[3] Стек промежуточного программного обеспечения
Несколько промежуточных программ образуют средний стек, который будет выполняться в порядке «первым пришел - последним вышел».
app.use () выполняется последовательно, на какое промежуточное программное обеспечение ссылается первым, а метод какого промежуточного программного обеспечения будет выполняться первым.
При обнаружении next () Koa передаст текущее промежуточное программное обеспечение следующему промежуточному программному обеспечению для обработки.
Если next () не определен в методе, Koa завершит запрос по умолчанию и вернет данные
Если после next () есть код, Koa будет ждать вызова всего приложения в порядке app.use (), а затем вернется, чтобы выполнить код после next () в обратном порядке, что является первым вошедшим. -последний только что упомянутый.
Девятка, Коа-роутер (маршрутизация)
Веб-сайты обычно имеют несколько страниц. Когда мы запрашиваем разные API или разные пути, мы должны выполнять разные методы и возвращать разные результаты. В настоящее время мы должны использовать Koa-router промежуточного слоя Koa для его обработки.
[1] Антропоморфный Коа-роутер
npm install -S koa-router
【2】 Чехол
const Koa = require('Koa');
const Router = require('koa-router'); // 引用koa-router
const app = new Koa();
const router = new Router();
// 定义get请求
// home是我们定义的访问路径:localhost:8000/home
router.get('/home', ctx => {
// 这个区域是中间件要去处理的上下文方法
ctx.body = '这是主页'
})
router.get('/detail', ctx => {
ctx.body = '这是详情页'
})
// app.use(router.routes()) 是把上面定义的路由里面的方法添加到Koa应用中
// allowedMethods方法可以把它看做一个拦截器,可以拦截一些我们应用没有定义的请求,然后返回相应的错误信息
app.use(router.routes()).use(router.allowedMethods())
app.listen(4000); // 设置端口号,让Koa应用运行4000端口上;
// 在浏览器访问 localhost:8000/home 输出了"这是主页"
// 在浏览器访问 localhost:8000/detail 输出了"这是详情页"
10. Ссылка на ссылку
http://www.ruanyifeng.com/blog/2017/08/koa.html
Статьи постоянно обновляются каждую неделю. Вы можете выполнить поиск по запросу " Front-end Collection " в WeChat, чтобы прочитать его впервые, ответьте на [ Video ] [ Book ], чтобы получить 200G видеоматериалов и 30 материалов для книг в формате PDF.
Взаимодействие с другими людьми