Всё о web

Для чайников и не только


Создаём REST API сервер на Hapi часть 1: Создаём базовую версию

Декабрь 3, 2018

Я уже писал как создать API сервер на вебсокетах и express.js. В этот раз мы будем делать классически REST сервер. В качестве основы будем использовать Hapi.

Для начала создаём папку с проектом, пусть это будет api-server, внутри создаём package.json

frfr@lenochka:~/programms/api-server$ cat package.json 
{
  "name": "api-server",
  "version": "1.0.0",
  "description": "API server",
  "main": "server.js",
  "scripts": {},
  "author": "",
  "license": "ISC",
  "dependencies": {}
}

И ставим первую пачку пакетов:

npm i hapi boom filepaths hapi-boom-decorators

hapi - собственно наш сервер

boom - модуль генерации стандартных ответов

filepaths - утилита которая рекурсивно выводит файлы из папки

Далее нужно создать следующую структуру папок:

Заполним config.js:

module.exports = {
  server: {
    host: '0.0.0.0',
    port: 3030
  }
}

Теперь начинаем писать server.js. Сперва подключаем модули:

#!/usr/bin/env node
'use strict';

const Hapi = require('hapi');
const filepaths = require('filepaths');
const hapiBoomDecorators = require('hapi-boom-decorators');

const config = require('./config');

Инициализацию сервера запихиваем в отдельную async функцию, чтобы мы могли использовать await внутри неё:

async function createServer() {
  // Инициализируем сервер
  const server = await new Hapi.Server(config.server);

  // Решистрируем расширение
  await server.register([
    hapiBoomDecorators
  ]);

  // Загружаем все руты из папки ./src/routes/
  let routes = filepaths.getSync(__dirname + '/src/routes/');
  for(let route of routes)
    server.route( require(route) );
  
  // Запускаем сервер
  try {
    await server.start();
    console.log(`Server running at: ${server.info.uri}`);
  } catch(err) { // если не смогли стартовать, выводим ошибку
    console.log(JSON.stringify(err));
  }

  // Функция должна возвращать созданый сервер, зачем оно нужно, расскажу далее
  return server;
}

createServer();

Теперь нужно написать наш единственный экшен: ./src/routes/root/get.js

// Наша функция, которая будет формировать ответ
async function response() {
  // content-type будет автоматически пгенерироваться, в зависимости от того какой тип данных будет в ответе
  return {
    result: 'ok',
    message: 'Hello World!'
  };
}

module.exports = {
  method: 'GET', // Метод
  path: '/', // Путь
  options: { 
    handler: response // Функция, обработчик запроса, для hapi 17 должна возвращать промис
  }
};

После этого можно запустить сервер:

node server.js

И проверяем наш сервер:

frfr@lenochka:~$ curl http://127.0.0.1:3030/
{"result":"ok","message":"Hello World!"}

frfr@lenochka:~$ curl http://127.0.0.1:3030/test
{"statusCode":404,"error":"Not Found","message":"Not Found"}

Наша заготовка под сервер готова. Новые руты добавляем в ./src/routes/ каждый метод в свой отдельный файл. Подробности по опциям рута на офф сайте: https://hapijs.com/tutorials/routing

Архив с примером: https://github.com/hololoev/api_hapi_example_1



Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *