Сборка простого приложения на Koa

Koa – это новый веб-фреймворк, созданный командой Express. Он разрабатывался как более современная и минималистичная версия Express.

Среди основных характеристик Koa – поддержка и использование новых функций JavaScript, в том числе генераторов и async/await. Koa поставляется без промежуточного ПО, хотя его можно добавить с помощью пользовательских плагинов.

В этой статье мы поговорим о фреймворке Koa подробнее и создадим с его помощью приложение, чтобы познакомиться с его функциональностью и философией.

Требования

  • Локальная установка Node.js (вы можете получить такую, следуя инструкциям в зависимости от вашей системы: mac OS, CentOSUbuntuDebian).
  • Практические навыки работы с синтаксисом JavaScript и ES6.

Это руководство было протестировано на версиях Node v15.14.0, npm v7.10.0, koa v2.13.1, @ koa/router v10.0.0 и koa-ejs v4.3.0.

1: Настройка проекта

Для начала создайте новый каталог для вашего проекта. Это можно сделать, запустив в своем терминале следующую команду:

mkdir koa-example

Примечание: Конечно, вы можете дать своему проекту любое имя, но в этой статье проект и, соответственно, его каталог будут называться koa-example.

У нас есть каталог проекта koa-example. Перейдите в него.

cd koa-example

Затем инициализируйте свой проект Node из этого каталога.

npm init -y

После выполнения команды npm init у вас будет файл package.json со стандартной конфигурацией.

Затем запустите эту команду, чтобы установить Koa:

npm install koa@2.13.1

Теперь у нас есть приложение, и оно готово к использованию фреймворка Koa.

2: Создание сервера Koa

Сначала создайте файл index.js. Затем откройте index.js в редакторе кода и добавьте следующие строки:

'use strict';

const Koa = require('koa');

const app = new Koa();

app.use(ctx => {

  ctx.body = 'Hello World';

});

app.listen(1234);

В приведенном выше фрагменте мы создали приложение Koa, работающее по порту 1234. Вы можете запустить его с помощью команды:

node index.js

Посетите свое приложение в браузере по адресу http://localhost:1234.

3: Добавление маршрутов и визуализации представления

Как упоминалось ранее, Koa.js поставляется без промежуточного ПО и, в отличие от своего предшественника, Express, по умолчанию не обрабатывает маршрутизацию.

Чтобы включить маршруты в приложении Koa, мы установим библиотеку промежуточного по для маршрутизации по имени Koa Router.

Откройте окно терминала и выполните следующую команду:

npm install @koa/router@10.0.0

Примечание: Ранее для этого использовали пакет koa-router, но теперь официально поддерживаемым пакетом является @koa/router.

Чтобы использовать маршрутизатор в своем приложении, внесите в файл index.js такие изменения:

'use strict';

const Koa = require('koa');

const Router = require('@koa/router');

const app = new Koa();

const router = new Router();

router.get('koa-example', '/', (ctx) => {

  ctx.body = 'Hello World';

});

app

  .use(router.routes())

  .use(router.allowedMethods());

app.listen(1234);

Этот код определяет маршрут по базовому URL-адресу вашего приложения Koa (http://localhost:1234) и регистрирует этот маршрут.

Дополнительные сведения об определении маршрутов в приложениях Koa.js можно найти в документации библиотеки Koa Router.

Как мы говорили ранее, Koa – это минималистичный фреймворк, поэтому для рендеринга представления с помощью механизма шаблонов вам потребуется установить библиотеку промежуточного ПО. Для этой цели Koa поддерживает несколько библиотек, но в этом мануале мы будем использовать Koa ejs.

Откройте окно терминала и выполните следующую команду:

npm install koa-ejs@4.3.0

Затем внесите изменения в файл index.js, чтобы зарегистрировать шаблон:

'use strict';

const Koa = require('koa');

const Router = require('@koa/router');

const render = require('koa-ejs');

const path = require('path');

const app = new Koa();

const router = new Router();

render(app, {

  root: path.join(__dirname, 'views'),

  layout: 'index',

  viewExt: 'html',

  cache: false,

  debug: true

});

router.get('koa-example', '/', (ctx) => {

  ctx.body = 'Hello World';

});

app

  .use(router.routes())

  .use(router.allowedMethods());

app.listen(1234);

При регистрации шаблона мы определили корневой каталог для файлов представления, расширение этих файлов и файл базового представления (который дополняют другие представления).

Теперь, когда вы зарегистрировали промежуточное ПО для шаблона, измените определение маршрута в index.js, чтобы отобразить этот файл:

// ...

router.get('koa-example', '/', (ctx) => {

  let koalaFacts = [];

  koalaFacts.push({

    meta_name: 'Color',

    meta_value: 'Black and white'

  });

  koalaFacts.push({

    meta_name: 'Native Country',

    meta_value: 'Australia'

  });

  koalaFacts.push({

    meta_name: 'Animal Classification',

    meta_value: 'Mammal'

  });

  koalaFacts.push({

    meta_name: 'Life Span',

    meta_value: '13 - 18 years'

  });

  koalaFacts.push({

    meta_name: 'Are they bears?',

    meta_value: 'No'

  });

  return ctx.render('index', {

    attributes: koalaFacts

  });

})

// ...

Теперь базовый маршрут отображает файл index.html, находящийся в каталоге views.

Далее нужно создать этот каталог и файл. Откройте views/index.html и добавьте следующие строки кода:

<h2>Koala - a directory Koala of attributes</h2>

<ul class="list-group">

  <% attributes.forEach( function(attribute) { %>

    <li class="list-group-item">

      <%= attribute.meta_name %> - <%= attribute.meta_value %>

    </li>

  <% }) %>

</ul>

Теперь при запуске приложения в веб-браузере будет отображаться следующее:

Koala - a directory Koala of attributes

Color - Black and white

Native Country - Australia

Animal Classification - Mammal

Life Span - 13 - 18 years

Are they bears? - No

Дополнительные сведения о промежуточном шаблоне koa-ejs вы найдете в документации библиотеки.

4: Обработка ошибок и ответов

Koa обрабатывает ошибки, определяя промежуточное ПО для этой цели в начале файла точки входа. Промежуточное ПО для ошибок должно быть внесено в файл заранее, потому приложение будет перехватывать только те ошибки, которые определены после этого промежуточного ПО.

Используем файл index.js в качестве примера. Внесите в этот код следующие изменения:

'use strict';

const Koa = require('koa');

const Router = require('@koa/router');

const render = require('koa-ejs');

const path = require('path');

const app = new Koa();

const router = new Router();

app.use(async (ctx, next) => {

  try {

    await next()

  } catch(err) {

    console.log(err.status)

    ctx.status = err.status || 500;

    ctx.body = err.message;

  }

});

// ...

Этот блок кода перехватит любую ошибку, возникшую во время выполнения приложения.

Вы можете проверить это, добавив ошибку в тело функции определенного нами маршрута:

// ...

router.get('error', '/error', (ctx) => {

  ctx.throw(500, 'internal server error');

});

app

  .use(router.routes())

  .use(router.allowedMethods());

app.listen(1234);

Теперь при запуске приложения с секцией /error в ссылке в веб-браузере будет отображаться следующее сообщение:

internal server error

Объект ответа Koa обычно встраивается в его объект контекста. Давайте покажем пример настройки ответов через определение маршрута:

// ...

router.get('status', '/status', (ctx) => {

  ctx.status = 200;

  ctx.body   = 'ok';

})

app

  .use(router.routes())

  .use(router.allowedMethods());

app.listen(1234);

Теперь при запуске приложения в веб-браузере с секцией /status в адресе будет отображаться следующее:

ok

Теперь приложение Koa обрабатывает ошибки и ответы.

Заключение

В этой статье вы узнали, как работает фреймворк Koa и как реализовать в проекте Koa его базовые функции. Koa – это минималистичный и гибкий фреймворк, функционал которого можно легко расширить. Из-за его сходства с Express некоторые разработчики даже называют его «Express 5.0».

Tags: , ,

Добавить комментарий