JSON RESTful API Server

Четвертая лекция

План

 

  1. JSON Web Token
  2. Express-async-router
  3. Swagger
  4. Bunyan
  5. Tests
  6. Задача

0

JWT

1

JWT

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

 

JWT.IO allows you to decode, verify and generate JWT.

1

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1N9Cj0JI1Njk4NjY3NdCkMDAwMTIw0KM3MNCjMCIsImVtYWlsIjoiVmljdG9yLk1heW9yb3ZAZ21haWwuY29tIiwibmFtZSI6ItCS0LjQutGC0L7RgCDQnNCw0LnQvtGA0L7QsiIsImlhdCI6MTQ3NTE3MjAxNn0.z2r4E-CXKDdEnk-rMUlmHadul78CallopAED7kZS-uY

JWT

1

По подробнее

1

Как использовать

1

JWT vs SAML 

1

JWT vs COOKIE/SESSION 

1

 Сравним

150ms

ssd 100ms

hdd  300ms

FS

MONGO

5ms

10ms

Redis

JWT decode

1

Express-async-router

2

How to use

2

router.get("/", function (req, res) {
    return myGetOperation()
        .then(myOtherOperation);
});

router.post("/:test", function (req, res) {
    return myParametrizedOperation(req.params.test)
        .then(myOtherOperation);
});

router.use(function (req, res) {
    return myMiddlewareOperation()
        .then(myOtherOperation);
});

With async

2

  api.get('/offer', async() => {
    return Offer.find();
  })

  api.get('/offer/:id', async(req) => {
    return Offer.check(req.params.id)
  })

  api.get('/offer/category/:id', async(req) => {
    return Offer.findByCategoryId(req.params.id)
  })

  api.get('/404', async(req) => {
    throw new Error('404 Not Found')
  })

Swagger

3

Swagger

3

Testing

3

JSON

3

RESTful

3

/api
{
  "message": "Current api is here: /api/v2",
  "url": "/api/v2"
}

/api/v2
{
  "code": 0,
  "message": "ok",
  "title": "api",
  "version": 2,
  "docs": "/api/v2/docs",
  "docsJson": "/api/v2/docs/json"
}

Bunyan

 

4

How to use

4

> npm install bunyan

var bunyan = require('bunyan');
var log = bunyan.createLogger({name: 'myapp'});
log.info('hi');
log.warn({lang: 'fr'}, 'au revoir');

How to use

4

$ node hi.js
{"name":"myapp","hostname":"banana.local","pid":40161,"level":30,"msg":"hi","time":"2013-01-04T18:46:23.851Z","v":0}
{"name":"myapp","hostname":"banana.local","pid":40161,"level":40,"lang":"fr","msg":"au revoir","time":"2013-01-04T18:46:23.853Z","v":0}

How to use

4

var bunyan = require('bunyan');
var log = bunyan.createLogger({
    name: <string>,                     // Required
    level: <level name or number>,      // Optional, see "Levels" section
    stream: <node.js stream>,           // Optional, see "Streams" section
    streams: [<bunyan streams>, ...],   // Optional, see "Streams" section
    serializers: <serializers mapping>, // Optional, see "Serializers" section
    src: <boolean>,                     // Optional, see "src" section

    // Any other fields are added to all log records as is.
    foo: 'bar',
    ...
});

How to use

4

> babel-node index.js
   | ./bunyan -o short -l trace

5

Tests

5

Mocha

var assert = require('assert');
describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});


> package.json
> "test": "mocha \"src/**/*.test.js\" 
           --require babel-register 
           --require test/setup.js",

5

Mocha

5

Supertest

var request = require('supertest');
var express = require('express');

var app = express();

app.get('/user', function(req, res) {
  res.status(200).json({ name: 'tobi' });
});

request(app)
  .get('/user')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '15')
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
  });

5

Supertest

describe('GET /user', function() {
  it('respond with json', function(done) {
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200, done);
  });
});

Задача

6

  • Создать модель User
  • Сделать регистрацию
  • Сделать авторизацию
  • Проверка приложенного JWT
  • Получение USER  из базы по JWT
  • * Подключить bunyan
  • * Подключить express-async-router
  • * Cтандартизировать API

статьте лайки, подписывайтесь на канал

Спасибо за внимание

Игорь Суворов

telegram.me/isuvorov

vk.com/igor.suvorov

github.com/isuvorov

 

Вопросы?

NaN

JSON RESTful API Server

By Igor Suvorov

JSON RESTful API Server

* JSON Web Token * Express-async-router * Swagger * Bunyan * Tests

  • 1,012