Это легковесная конструкция сервера RESTful API на основе Koa2, поддерживающая ES6.
Примечание: Из-за обновления версии Koa до Yöntem 2.3.0+, требуется Node.js версии не ниже v8.0.0 (рекомендовано v11.13.0), NPM версии не ниже v5.0.0. Рекомендуется использовать yarn вместо npm.
Данные передаются в JSON формате. POST, PUT, DELETE методы поддерживают тип контента application/x-www-form-urlencoded
, multipart/form-data
, application/json
. Поддерживается конфигурация CORS. Для отправки данных, кроме загрузки файлов, рекомендуется использовать application/x-www-form-urlencoded
. Обычно данные возвращаются в формате JSON с типом контента application/json
.
Поддерживаются нереляционные базы данных, такие как Redis. В связи с потребностями разработки RESTful API сервера используется Sequelize.js как ORM для реляционных баз данных PostgreSQL, MySQL, MariaDB, SQLite, MSSQL. Если ORM для реляционных баз данных не нужен, выполните команду npm remove sequelize -S
и удалите файл src/lib/sequelize.js
.
Эта конструкция установлена с минимальным набором плагинов, совместимых с Koa2, необходимых для создания RESTful API сервера, каждый из которых имеет описание. Используется ESLint для проверки синтаксиса.Поскольку эта конструкция предназначена для предоставления RESTful API, она пока не рассматривает обработку статических ресурсов для фронтенда, предоставляя лишь базовый метод доступа к статическим ресурсам для удобства доступа к пользователям загруженным на сервер изображениям и другим ресурсам. Базовая структура директорий совпадает со структурой vue-cli, что позволяет использовать её вместе с фреймворками React, AngularJS и Vue.js. При использовании Cordova/PhoneGap, Electron необходимо включить поддержку CORS.Отказ от ответственности: Эта конструкция предоставляет базовое окружение для удобства разработки. Любой человек или организация могут свободно клонировать и использовать её. Использование введенных фреймворков требует соблюдения условий лицензий авторов этих фреймворков (частичный список и источники приведены ниже). Автор не несет никакой юридической ответственности за любые последствия использования этой конструкции, использование которой означает согласие с этим положением.
На данный момент модуль тестирования не включен, но будет добавлен в следующей версии вместе с интегрированным решением. Рекомендуется самостоятельно интегрировать Jest.
Конструкция SSR на основе Vue 2, Webpack 4, Koa 2: https://github.com/yi-ge/Vue-SSR-Koa2-Scaffold.
$ git clone https://github.com/yi-ge/koa2-API-scaffold.git
$ cd koa2-API-scaffold
$ npm install
$ npm run dev # Можно выполнить npm start для пропуска проверки ESLint.
Доступ: http://127.0.0.1:3000/
$ npm run dev --debug
Или
$ npm start --debug
Поддерживает встроенную отладку Node.js: https://nodejs.org/api/debugger.html
Создает исполняемые файлы Node.js в директорию dist:
$ npm run build
$ npm run production # запуск в режиме производства
Или
$ node dist/app.js
$ pm2 start pm2.js
Настройка PM2 совместно с Docker: http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/
$ docker pull node
$ docker run -itd --name RESTfulAPI -v $(pwd):/usr/src/app -w /usr/src/app node node ./dist/app.js
Проверьте успешность запуска и состояние работы командой docker ps
Когда требуется простота, можно сделать так:
$ nohup node ./dist/app.js > logs/out.log &
Проверьте состояние работы (если есть node app.js
, значит приложение работает в фоновом режиме):
$ ps aux | grep app.js
Просмотрите логи работы
$ cat logs/out.log
Мониторинг состояния работы
$ tail -f logs/out.log
После выполнения npm run build
в проекте Vue-cli (Vue2) все статические файлы будут созданы в директории dist
. Рекомендовано использовать Nginx для управления статическими ресурсами для достижения наилучших результатов, а затем запустить RESTful API сервер любым из вышеописанных способов. Передняя и задняя части полностью разделены, обратите внимание на настройку CORS в конфигурационном файле Koa2 RESTful API Server.
Рекомендованная конфигурация Nginx:
server
{
listen 80;
listen [::]:80;
server_name abc.com www.abc.com; # привязка домена
index index.html index.htm;
root /www/app/dist; # директория dist после компиляции Vue-cli
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
}
``````markdown
## Настройки времени жизни кэша
```nginx
location ~ .*\.(js|css)$ {
expires 12h;
}
location ~ /.* {
deny all;
}
access_log off; # путь к журналу доступа
}
(укажите имя файла конфигурации Nginx в каталоге nginx_config):
$ docker run -itd -p Yöntem:80 -p 443:443 -v $(pwd)/nginx_config:/etc/nginx/conf.d nginx
В файле src/app.js
присутствует следующий код:
.use(jwt({ secret: publicKey }).unless({ path: [/^\/public|\/user\/login|\/assets/] }))
Путь в массиве path
, начинающийся с указанных значений, не требует аутентификации, все остальные пути должны проходить через процесс аутентификации.
import axios from "axios";
import { getToken } from "./tool";
const DevBaseUrl = "http://127.0.0.1:8080";
const ProdBashUrl = "https://xxx.xxx";
let config = {
baseURL: process.env.NODE_ENV !== "production" ? DevBaseUrl : ProdBashUrl // Конфигурация API адреса
};
let token = getToken();
if (token) {
config.headers = { Authorization: "Bearer " + token };
}
let request = axios.create(config);
// HTTP запросы
axios.interceptors.request.use(
config => {
if (window) {
let token = getToken();
if (token) {
// Проверка наличия токена, если он существует, то каждый HTTP заголовок будет содержать токен
config.headers.Authorization = `Bearer ${token}`;
}
}
// if (config.method === 'get') {
// config.url = config.url + 'timestamp=' + Date.now().toString()
// }
return config;
},
err => {
return Promise.reject(err);
}
);
export default request;
```Файл tool.js
:
// Saving cookies
export const setCookie = function setCookie(name, value, time) {
if (time) {
let strsec = getsec(time);
let exp = new Date();
exp.setTime(exp.getTime() + parseInt(strsec));
document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + exp.toGMTString();
} else {
document.cookie = name + "=" + encodeURIComponent(value);
}
};
```// Чтение cookie
```javascript
export const getCookie = function getCookie(name) {
let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
let arr = document.cookie.match(reg);
return arr ? decodeURIComponent(arr[2]) : null;
};
// Удаление cookie
export const delCookie = function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval !== null) {
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
};
// Получение токена
export const getToken = function getToken() {
if (window.sessionStorage && window.sessionStorage.Bearer) {
return window.sessionStorage.Bearer;
} else if (window.localStorage && window.localStorage.Bearer) {
return window.localStorage.Bearer;
} else if (window.document.cookie) {
return getCookie("Bearer");
}
};
# Установка токена
```javascript
export let setToken = function(token, rememberTime) {
if (window.sessionStorage) {
window.sessionStorage.Bearer = token;
}
if ((rememberTime && window.localStorage) || !window.sessionStorage) {
window.localStorage.Bearer = token;
}
if (
window.document.cookie && !window.sessionStorage && !window.localStorage
) {
if (rememberTime) {
setCookie("Bearer", token, rememberTime);
} else {
setCookie("Bearer", token);
}
}
};
export let delToken = function() {
if (window.sessionStorage && window.sessionStorage.Bearer) {
window.sessionStorage.removeItem("Bearer");
}
if (window.localStorage && window.localStorage.Bearer) {
window.localStorage.removeItem("Bearer'");
}
if (window.document.cookie) {
delCookie("Bearer");
}
};
Получаем токен после успешного запроса API (обычно это аутентификация), сохраняем его локально и при каждом запросе передаем в заголовке Authorization: "Bearer " + token. Обычно нет необходимости беспокоиться о раскрытии локального токена.#### Введение плагинов
koa@2 koa-body@2 koa-router@next koa-static2 koa-compose require-directory babel-cli babel-register babel-plugin-transform-runtime babel-preset-es2015 babel-preset-stage-2 gulp gulp-eslint eslint eslint-config-standard eslint-friendly-formatter eslint-plugin-html eslint-plugin-promise nodemailer promise-mysql и т.д.
koa2: HTTP-фреймворк
Краткое описание: HTTP-фреймворк.
Источник: https://github.com/koajs/koa v2
koa-body: парсер данных формы
Краткое описание: Полнофункциональный средний слой парсера данных формы для koa.
Источник: https://github.com/dlau/koa-body
koa-router: маршрутизация для koa
Краткое описание: Средний слой маршрутизации для koa.
Источник: https://github.com/alexmingoia/koa-router/tree/master/
koa-static2: средний слой для обслуживания статических ресурсов
Краткое описание: Средний слой для Koa2 для обслуживания папки с названием, указанного пользователем.
Источник: https://github.com/Secbone/koa-static2
koa-compose: объединение нескольких средних слоев в один
Краткое описание: Объединяет несколько средних слоев в один.
Источник: https://github.com/koajs/compose
require-directory: рекурсивное прохождение через указанный каталог
Краткое описание: Рекурсивное прохождение через указанный каталог.
Источник: https://github.com/troygoode/node-require-directory
babel-cli: компиляция кода ES6 в ES5
Резюме: Babel — это JavaScript-компилятор, который преобразует код ES6 в ES5.
Источник: https://github.com/babel/babel/tree/master/packages/babel-cli
babel-register: реальная-time компиляция ES6 кода с помощью Babel
Резюме: Babel-хук.
Источник: https://github.com/babel/babel/tree/master/packages/babel-cli**babel-plugin-transform-runtime**: Конфигурация зависимостей для ES6 с помощью Babel
babel-preset-es2015: То же самое
babel-preset-stage-2: То же самое
gulp: Автоматизация сборки на основе потока данных
Резюме: Gulp — это набор инструментов для автоматизации трудоёмких или времязатратных задач.
Источник: https://github.com/gulpjs/gulp
gulp-eslint: плагин проверки ESLint для Gulp
Резюме: Плагин для Gulp, использующий ESLint.
Источник: https://github.com/adametry/gulp-eslint
gulp-nodemon: Автоматический перезапуск приложения после изменения JS кода
Резюме: Nodemon отслеживает файлы в директории, где был запущен nodemon, и если какие-либо файлы изменятся, nodemon автоматически перезапускает ваше приложение на Node.js.
Источник: https://github.com/remy/nodemon
eslint: Инструмент проверки синтаксиса JavaScript
Резюме: Полностью модульный инструмент для выявления и отчета о шаблонах в JavaScript.
Источник:
eslint-config-standard: конфигурация ESLint
Резюме: Разделённая конфигурация ESLint для стиля JavaScript Standard.
Источник: https://github.com/feross/eslint-config-standard
eslint-friendly-formatter: удобство вывода сообщений ESLint в Sublime Text или iTerm2, а также плагины ESLint для Atom
Резюме: Простой форматтер/отчёт для ESLint, который удобен для использования в Sublime Text и iTerm2 'переход к открытию файла'.
Источник: https://github.com/royriojas/eslint-friendly-formatter**eslint-plugin-html**: Проверка правил синтаксиса JavaScript в HTML файлах
Резюме: Плагин ESLint для извлечения и проверки скриптов из HTML файлов.
Источник: https://github.com/BenoitZugmeyer/eslint-plugin-html**eslint-plugin-promise**: Проверка JavaScript промисов
Резюме: Обеспечивает лучшие практики для JavaScript промисов.
Источник: https://github.com/xjamundx/eslint-plugin-promise
eslint-plugin-standard: Зависимости ESLint
Резюме: Правила ESLint для стандартного линтера.
Источник: https://github.com/xjamundx/eslint-plugin-standard
nodemailer: Отправка электронной почты
Резюме: Отправка электронных писем с помощью Node.JS.
Источник: https://github.com/nodemailer/nodemailer
promise-mysql: Библиотека для работы с базой данных MySQL
Резюме: Promise Mysql.
Источник: https://github.com/lukeb-uk/node-promise-mysql
sequelize: Объектно-реляционное отображение (ORM) для работы с базами данных
Резюме: Sequelize — это объектно-реляционное отображение (ORM) на основе промисов для Node.js.
Источник: https://github.com/sequelize/sequelize
mysql: Библиотека для работы с базой данных MySQL
Резюме: Чистый клиент node.js на языке JavaScript, реализующий протокол MySQL.
Источник: https://github.com/mysqljs/mysql
Список middleware для поддержки Koa2: https://github.com/koajs/koa/wiki
Другие часто используемые плагины для Koa2:
koa-session2: Middleware для управления сессиями
Резюме: Middleware для Koa2 для получения/установки сессий.
Источник: https://github.com/Secbone/koa-session2
koa-nunjucks-2:
Шаблонизатор Nunjucks, который можно использовать как в frontend, так и в backend: https://github.com/mozilla/nunjucks
koa-favicon:
Middleware favicon для Koa: https://github.com/koajs/favicon**koa-server-push**:
Middleware HTTP2 push: https://github.com/silenceisgolden/koa-server-push
koa-convert: Преобразование старых middleware для поддержки Koa2
Резюме: Преобразует middleware на основе генераторов Koa в middleware на основе промисов.
Источник: https://github.com/koajs/convert
koa-logger: Middleware для вывода логов запросов
Резюме: Middleware для вывода логов в режиме разработки для Koa.
Источник: https://github.com/koajs/logger
koa-onerror:
Middleware для перехвата ошибок Koa
Источник: https://github.com/koajs/onerror
koa-multer: Middleware для обработки данных
Резюме: Multer — это middleware для обработки multipart/form-data для Koa.
Источник: https://github.com/koa-modules/multerОписание структуры директорий
------------```bash
.
├── README.md
├── .babelrc # Конфигурационный файл Babel
├── .editorconfig # Файл с определением стилей редактора
├── .eslintignore # Файл со списком игнорируемых ESLint
├── .eslintrc.js # Конфигурационный файл ESLint
├── .gitignore # Файл со списком игнорируемых Git
├── gulpfile.js # Конфигурационный файл Gulp
├── package.json # Описание пакета
├── pm2.js # Пример конфигурации PM2
├── build # Входной каталог сборки
│ └── dev-server.js # Входной файл для реального времени компиляции в среде разработки
├── src # Каталог исходного кода, скомпилированный код находится в каталоге dist
│ ├── app.js # Входной файл
│ ├── config.js # Основной конфигурационный файл (ОБРАТИТЕ ВНИМАНИЕ! ДАННЫЙ ФАЙЛ СОДЕРЖИТ ЧУТЬ ЛИ НЕГОСПРИЯТНУЮ ИНФОРМАЦИЮ!)
│ ├── plugin # Каталог плагинов
│ │ └── smtp_sendemail # Пример плагина - отправка электронной почты
│ ├── tool # Каталог инструментов
│ │ ├── PluginLoader.js # Инструмент загрузки плагинов
│ │ └── Common.js # Пример плагина - отправка электронной почты
│ ├── lib # Каталог библиотек
│ ├── controllers # Контроллеры
│ ├── models # Модели
│ ├── routes # Роуты
│ └── services # Услуги
├── assets # Каталог статических ресурсов
└── logs # Каталог логов
--------------------------------------------``````python
import Vue from 'vue'
import axios from 'axios'
const DevBaseUrl = 'http://127.0.0.1:3000'
const ProdBashUrl = 'https://api.xxx.com'
let config = {
baseURL: process.env.NODE_ENV !== 'production' ? DevBaseUrl : ProdBashUrl # Настройка адреса API
}
if (process.env.VUE_ENV !== 'server') {
let token = getToken() # Этот метод следует реализовать самостоятельно
if (token) {
config.headers = {'Authorization': 'Bearer ' + token}
}
}
let request = axios.create(config)
# HTTP запросы - интерцепторы
axios.interceptors.request.use(
(config) => {
if (window) {
let token = getToken()
if (token) { # Проверка наличия токена, если он существует, то каждый HTTP заголовок будет содержать токен
config.headers.Authorization = `Bearer ${token}`
}
}
return config
},
(err) => {
return Promise.reject(err)
}
)
Vue.prototype.$request = request
```
Примеры вызова RESTful API различными популярными фреймворками (для справки)
------------------------------------------------------------------------------
### AngularJS (Ionic аналогичен)
```python
$http({
method: 'post',
url: 'http://localhost:3000/xxx',
data: {para1:'para1',para2:'para2'},
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).success(function (data) {
}).error(function (data) {
})
```
### jQuery
```python
$.ajax({
cache: false,
type: Yöntem: 'POST',
url: 'http://localhost:3000/xxx',
data: {
para1: para1
},
async: false,
dataType: 'json',
success: function (result) {
},
error: function (err) {
console.log(err)
}
})
# Загрузка файла
# Создание объекта FormData
var data = new FormData()
# Добавление данных в объект FormData
#
$.each($('#inputfile')[0].files, function (i, file) {
data.append('upload_file', file)
})
$.ajax({
url: 'http://127.0.0.1:3000/api/upload_oss_img_demo',
type: 'POST',
data: data,
cache: false,
contentType: false, # Необходимо
processData: false, # Необходимо
success: function (data) {
console.log(data)
if (data.result === 'ok') {
$('#zzzz').attr('src', data.img_url)
}
})
``` }
})
```
### MUI
```python
mui.ajax({ url: 'http://localhost:3000/xxx', dataType: 'json',
success: function(data) {
},
error: function(data) {
console.log('ошибка!')
}
})
```
### JavaScript
```
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/xxx', true); // POST или GET, true (асинхронный) или false (синхронный)
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 304)) {
var gotServices = JSON.parse(xhr.responseText);
} else {
console.log('AJAX запрос завершился с ошибкой');
}
};
xhr.send({para1: para1});
```
### vue-resource
https://github.com/pagekit/vue-resource
```
// глобальный объект Vue
Vue.http.post('/someUrl', [body], {
headers: {'Content-type', 'application/x-www-form-urlencoded'}
}).then(successCallback, errorCallback);
```
### fetch
https://github.com/github/fetch
```
fetch('/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Hubot',
login: 'hubot',
})
}).then(function(response) {
// response.text()
}).then(function(body) {
// body
});
// Загрузка файла
var input = document.querySelector('input[type="file"]');
var data = new FormData();
data.append('file', input.files[0]);
data.append('user', 'hubot');
fetch('/avatars', {
method: 'POST',
body: data
});
```
### superagent
https://github.com/visionmedia/superagent
```
request.post('/user')
.set('Content-Type', 'application/json')
.send('{"name":"tj","pet":"tobi"}')
.end(callback);
```
### request
https://github.com/request/request
```
request.post('/api').form({key:'value'}), function(err, httpResponse, body){ /* ... */ });
```
В React можно поместить любой из вышеупомянутых методов в `componentDidMount()`, аналогично в Vue.js.
Полное удаление ESLint
-----------------------
Удалите все плагины, начинающиеся на `eslint` из `devDependencies` в `package.json`, а также файлы `.eslintignore` и `.eslintrc.js` из корневой директории. Измените поле `dev` в `package.json` на:```
'dev': 'gulp start'
```
Удалите задачи `lint` и `eslint_start` из файла `gulpfile.js` и замените задачу `default` на `"gulp.task('default', ['start'])"`.
Обновление
----------
*v1.0.0 7 апреля 2019 года 21:19:59*
1. Обновлены версии зависимостей (Node v11.13.0).
2. Добавлена Jest.
*v0.2.6 24 марта 2018 года 22:16:43*
1. Обновлены версии зависимостей (Node v9.9.0).
*v0.2.5 13 января 2018 года 10:37:29*
1. Обновлены версии зависимостей до Node v9.3.0.
2. Добавлена инструкция по использованию токенов.
*v0.2.4 1 декабря 2017 года 14:16:03*
1. Обновлены версии зависимостей до Node v9.2.0.
*v0.2.3 23 октября 2017 года 23:26:56*
1. Обновлены версии зависимостей до Node v8.7.0.
*v0.2.2 17 сентября 2017 года 17:45:07*
1. Обновлены версии зависимостей для тестирования на Node v8.5.0.
*v0.2.1 19 июля 2017 года 19:38:19*
1. Удалён модуль MySQL (повторение).
2. Добавлено более подробное описание.
*v0.2 16 июля 2017 года 22:48:34*
1. Обновлен Koa до версии 2.3.0.
2. Заменён Koa-session2 на Koa-jwt, добавлен jsonwebtoken.
3. Обновлены следующие зависимости до указанных версий:```
Koa 2.2.0 2.3.0 2.3.0 koa2-API-scaffold
koa-body 2.2.0 2.3.0 2.3.0 koa2-API-scaffold
koa-router 7.1.0 7.2.1 7.2.1 koa2-API-scaffold
babel-cli 6.23.0 6.24.1 6.24.1 koa2-API-scaffold
babel-preset-es2015 6.23.0 6.24.1 6.24.1 koa2-API-scaffold
babel-preset-stage-2 6.23.0 6.24.1 6.24.1 koa2-API-scaffold
babel-register 6.23.0 6.24.1 6.24.1 koa2-API-scaffold
eslint-plugin-promise 3.4.0 3.5.0 3.5.0 koa2-API-scaffold
koa-compose 3.0.0 4.0.0 4.0.0 koa2-API-scaffold
nodemailer 4.0.0 4.0.1 4.0.1 koa2-API-scaffold
sequelize 4.2.0 4.3.2 4.3.2 koa2-API-scaffold
eslint 4.1.1 4.2.0 4.2.0 koa2-API-scaffold
eslint-config-standard 10.1.0 10.2.1 10.2.1 koa2-API-scaffold
eslint-friendly-formatter 2.1.0 3.0.0 3.0.0 koa2-API-scaffold
eslint-plugin-html 3.0.0 3.1.0 3.1.0 koa2-API-scaffold
gulp-eslint 3.0.0 4.0.0 4.0.0 koa2-API-scaffold
koa-logger 2.0.0 3.0.1 3.0.1 koa2-API-scaffold
```*v0.0.6 2017 года 2 февраля 17:17:23*
1. Изменён файл src/lib/sequelize.js, добавлена поддержка utf8mb4 (требуется версия MySQL > 5.5).
*v0.0.5 2017 года 12 февраля 01:25:34*
1. Изменён файл gulpfile.js, теперь при горячем перезапуске при изменении файла нет необходимости проверять все файлы, достаточно проверять изменённые, что увеличивает скорость разработки.
2. В package.json значение поля "start" изменено на "gulp nodemon", совместимо с изменениями в файле gulpfile.js.*v0.0.4 2017 года 2 февраля 7:15:57*
1. Изменены методы конфигурации некоторых конфигурационных файлов, сделав их более строгими (пользователям старых версий это не касается, изменения не влияют на работу программы).
2. В eslintrc.js изменён JavaScript-версионный конфигуратор на ES8, обеспечивая совместимость с async и await.
3. В файле gulpfile.js на строке 12 добавлен контроль `src/**/*.js`.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )