Node.js и Express пишем API

Node.js и Express пишем API

Самый простой пример «Привет, Мир!» на nodejs и express, который возвращает json, работает как api, создадим файл index.js

const express = require('express');

const app = express();

app.get('/', (req, res)=>{
    res.json({
        message: 'Привет, мир!'
    })
})

app.listen(3000, function () {  
    console.log('Сервер запущен!');
})

Конечно предварительно нужно создать файлы package.json и установить express: npm install express —save

После запуска node index.js

Браузер по адресу http://localhost:3000 возвращает json:

{"message":"Привет, мир!"}

Программа для тестирования http запросов

Для тестирования http запросов: удобно использовать программу insomnia
https://insomnia.rest/download/

Также отличная программа для тестирования запросов postman: https://www.getpostman.com/

Подключаем роутинг, разбиваем проект на файлы

После разбивки получилась такая структура проекта:

controllers
  todo.js
routes
  todo.js
index.js
package.json

Файл index.js:

const express = require('express');
const routerTodo = require('./routes/todo');
const PORT = process.env.PORT || 3000
const app = express();

app.use('/', routerTodo);

app.use(function(req, res, next){
    const err = new Error('Ни хрена не найдено!');
    err.status = 404;
    next(err);   
});

app.use(function(err, req, res, next){
    res.status(err.status || 500);
    res.json({
        message: err.message,
        error: err
    })     
})

const server = app.listen(PORT, function () {  
    console.log('Сервер пашет на порту: ' + server.address().port);
})

PORT — берется из переменной окружения, а если ее нет, то ставится 3000, это полезно особенно при развертывании на heroku.

Этот код говорит, что при обращении к localhost:3000 будет вызывать экспортируемую функцию из ‘./routes/todo’.

Если в роутере ничего не найдено, будет сгенерирована ошибка 404.

Если выпала ошибка, определяет, если статус не задан, то задается 500 ошибка.

use — это подключение middleware, например он может еще быть таким:

app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

Файл todo.js из routes:

const express = require('express');
const router = express.Router();
const ctrlTodo = require('../controllers/todo');

router.get('/', ctrlTodo.getTodo);
router.get('/welcome', (req, res)=>{
    res.json({
        message: 'Добро пожаловать!'
    })   
});

module.exports = router;

Этот код говорит, что при обращении к localhost:3000, будет вызываться todo.js из controllers, а при обращении на localhost:3000/welcome, будет выводится json c месседжем ‘Добро пожаловать!’

Файл todo.js из controllers:

module.exports.getTodo = function(req, res) {
    res.json({
        message: 'Список задач!'
    })
}

Получение параметров в запросе GET

http://localhost:3000/todo?name=todolist&user=test — это GET запрос

app.get('/todo', function(req, res) {
  console.log(req.query.name);
  res.json(req.query.name);
});

Именованные параметры маршрутизации

http://localhost:3000/todo/login

app.get('/todo/:name', function(req, res) {
  console.log(req.params.name);
  res.json(req.params.name);
});

POST Запросы

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true });

app.post('/todo', function(req, res) {
  console.log(req.body.name);
  res.json(req.body.name);
})

Для пост запросов добавляем дополнительно body-parser.

extended, если хотим передавать массив значений, то указываем true, в большинству случаев хватает и false

Обработка запросов

var express = require('express');
var app = express();

app.all('/', function (req, res, next) {
  console.log('Буду выполнятся для любого запроса и пошлю запрос дальше по очереди ...');
  next(); // посылаю на х.. к следующему обработчику
});

app.get('/', function (req, res) {
  res.send('Получил GET запрос');
});

app.get('/:id', function (req, res) {
  let id = req.params.id;
  res.send('Получил GET запрос с параметром: ' + id);
});

app.post('/', function (req, res) {
  res.send('Получил POST запрос');
});

app.put('/', function (req, res) {
  res.send('Получил PUT запрос');
});

app.patch('/', function (req, res) {
  res.send('Получил PATCH запрос');
});

app.delete('/', function (req, res) {
  res.send('Получил DELETE запрос');
});

app.listen(3000, function () {
  console.log('Сервер слушает внимательно!');
});