{"id":294448,"date":"2019-09-09T15:00:26","date_gmt":"2019-09-09T15:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=294448"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=294448","title":{"rendered":"\u041f\u0435\u0440\u0432\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043c\u0435\u0441\u0442\u043e \u0438\u043b\u0438 \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 API \u043d\u0430 Node.js"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u044d\u043c\u043e\u0446\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0432\u044b\u043a\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e REST API \u043d\u0430 Node.js \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c TypeScript, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0441 \u043d\u0443\u043b\u044f. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f: <i>\u00ab\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u0438\u043f\u043b\u043e\u043c. \u041a\u0443\u0434\u0430 \u0436\u0435 \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?\u00bb<\/i> \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u043f\u0443\u0441\u0442\u044c \u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u0438 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c. \u041f\u043e\u0437\u0432\u0430\u043b \u043a \u0441\u0435\u0431\u0435 \u043d\u0430 \u0441\u0442\u0430\u0436\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (\u0432\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a \u0442\u043e\u0439 \u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438). \u041f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u042f, \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u043b\u044b \u0438 \u043f\u043e\u0448\u0435\u043b\u2026<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m5\/rl\/yq\/m5rlyqzlhotg2fxugcj6jr1vozu.png\" alt=\"image\"\/><\/p>\n<h3>\u0414\u0435\u043d\u044c \u043f\u0435\u0440\u0432\u044b\u0439. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Node.js<\/h3>\n<p>  \u041f\u0440\u0438\u0448\u0451\u043b \u044f \u043d\u0430 back-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 IT-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 <a href=\"http:\/\/nodejs.org\">Node.js<\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c. \u042f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0431\u0435\u0436\u0430\u043b \u0432\u043f\u0435\u0440\u0435\u0434, \u0437\u0430\u0431\u044b\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e, \u0447\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043d\u0430 JavaScript (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c). \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0446\u0435\u043b\u043e\u043c \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b CRUD \u043d\u0430 Java, Python \u0438 Clojure, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043d\u044c \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u043b \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e Node.js, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/learn.javascript.ru\/screencast\/nodejs\">\u0441\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442<\/a>. <\/p>\n<p>  \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0430\u044f \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/expressjs.com\">Express<\/a>, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <a href=\"http:\/\/www.npmjs.com\">npm<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u0430\u043a package.json \u0438 tsconfig.json, \u0433\u043e\u043b\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u043b\u0430 \u043a\u0440\u0443\u0433\u043e\u043c \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0443\u0440\u043e\u043a, \u0447\u0442\u043e \u0443\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u043b\u0438\u0437\u043a\u0430\u044f \u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439. \u041a \u043a\u043e\u043d\u0446\u0443 \u0434\u043d\u044f \u044f \u0432\u0441\u0435 \u0436\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043c\u043e\u0433 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c express \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440! \u041d\u043e \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u043b \u0434\u043e\u043c\u043e\u0439 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0427\u0443\u0432\u0441\u0442\u0432\u043e, \u0447\u0442\u043e \u044f \u0443\u0442\u043e\u043f\u0430\u043b \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 JS \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u043e \u043c\u0435\u043d\u044f \u043d\u0438 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h3>\u0414\u0435\u043d\u044c \u0432\u0442\u043e\u0440\u043e\u0439. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 TypeScript<\/h3>\n<p>  \u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c. \u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0437\u043d\u0430\u043b \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u043a \u043d\u0435\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435. \u0417\u043d\u0430\u044f, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c JavaScipt, \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 Node.js \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0442\u0435\u043a\u043b\u043e \u043a \u044f\u0437\u044b\u043a\u0443 TypeScript, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443. \u0417\u0434\u0435\u0441\u044c \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0435 <b>\u0442\u0438\u043f\u044b<\/b>, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e 2 \u0434\u043d\u044f \u0442\u043e\u043c\u0443 \u043d\u0430\u0437\u0430\u0434 <b>\u043d\u0435<\/b> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u0438 \u0431\u044b\u043b\u043e \u043c\u043e\u0438\u043c \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u0448\u0430\u043b\u043e \u043c\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0443\u0441\u0432\u043e\u0438\u0442\u044c \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 JavaScript \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043d\u044c. <\/p>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Java, C++, C#. \u041e\u0441\u043e\u0437\u043d\u0430\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 TypeScript, \u044f \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0441\u0435\u0431\u044f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0442\u0430\u0440\u0435\u043b\u043a\u0435. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432\u0434\u043e\u0445\u043d\u0443\u043b \u0432 \u043c\u0435\u043d\u044f \u0436\u0438\u0437\u043d\u044c \u044d\u0442\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0442\u043e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434. \u041f\u043e\u0434 \u0437\u0430\u043d\u0430\u0432\u0435\u0441 \u0434\u043d\u044f \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0441\u0435\u0440\u0432\u0435\u0440 (\u0443\u0436\u0435 \u043d\u0430 TypeScript), \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443. \u0418\u0442\u043e\u0433: \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 API. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u2026<\/p>\n<h3> \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 API<\/h3>\n<p>  \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 REST API \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jv\/0k\/fz\/jv0kfzdektfwbeiyw6ib5cp5pxi.png\" alt=\"image\"\/><\/p>\n<p>  <b>\u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u044f\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/b><\/p>\n<p>  \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 REST API. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e bearer \u0442\u043e\u043a\u0435\u043d\u0443 (\/info, \/latency, \/logout). \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 CORS \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. DB \u2014 MongoDB. \u0422\u043e\u043a\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u0445\u043e\u0434\u0435. <\/p>\n<p>  <b>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 API:<\/b><\/p>\n<ol>\n<li> \/signin [POST] \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 bearer \u0442\u043e\u043a\u0435\u043d\u0430 \u043f\u043e id \u0438 \u043f\u0430\u0440\u043e\u043b\u044e \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 json <\/li>\n<li> \/signup [POST] \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 json <\/li>\n<li> \/info [GET] \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0438\u043f id, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0439 bearer \u0442\u043e\u043a\u0435\u043d \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <\/li>\n<li> \/latency [GET] \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 (ping), \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0439 bearer \u0442\u043e\u043a\u0435\u043d \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/li>\n<li> \/logout [GET] \u2014 \u0441 \u043f\u0430\u043c\u0435\u0442\u0440\u043e\u043c all: true \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 bearer \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 false \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 bearer \u0442\u043e\u043a\u0435\u043d <\/li>\n<\/ol>\n<p>  \u041e\u0442\u043c\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443, \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c 3 \u0434\u043d\u044f \u043d\u0430\u0437\u0430\u0434 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u043b! \u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043d\u0430 \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0439 \u0438 \u043d\u0430 Python \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e. \u0421\u0442\u0435\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0435\u0434\u0432\u0435\u0449\u0430\u043b \u0431\u0435\u0434\u044b.<\/p>\n<h4>\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0447\u0442\u043e \u0443\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u043b \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u043d\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432), \u0441 \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0430\u0447\u043d\u0435\u043c. \u0414\u043b\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/github.com\/typestack\/routing-controllers\">routing-controllers<\/a>, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e\u043c \u0441 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0438\u0437 Spring Framework (Java). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 ORM \u044f \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/github.com\/typeorm\/typeorm\">typeorm<\/a>, \u0445\u043e\u0442\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 MongoDB \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/www.npmjs.com\/package\/uuid\">uuid<\/a>, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.npmjs.com\/package\/dotenvhttp:\/\/\">dotenv<\/a>.<\/p>\n<h4>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h4>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f express \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043d\u043e \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Routing Controllers, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c express \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"javascript\">\/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Express const app = createExpressServer({    \/\/\u041f\u0440\u0435\u0444\u0438\u043a\u0441    routePrefix: process.env.SERVER_PREFIX,    \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438    defaults: {       nullResultCode: Number(process.env.ERROR_NULL_RESULT_CODE),       undefinedResultCode: Number(process.env.ERROR_NULL_UNDEFINED_RESULT_CODE),       paramOptions: {          required: true       }    },    \/\/\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f    authorizationChecker: authorizationChecker,    \/\/\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440    controllers: [UserController] }); \/\/\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f app.listen(process.env.SERVER_PORT, () =&gt; {    console.log(process.env.SERVER_MASSAGE); });<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043d\u0435\u0442. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u0432 \u043d\u0438\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.   <\/p>\n<ul>\n<li>routePrefix \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0432 \u0432\u0430\u0448\u0435\u043c url \u043f\u043e\u0441\u043b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <i><a href=\"http:\/\/localhost\">localhost<\/a>:3000\/prefix<\/i><\/li>\n<li>defaults \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434\u044b \u043e\u0448\u0438\u0431\u043e\u043a <\/li>\n<li>authorizationChecker \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e <\/li>\n<li>controllers \u2014 \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u0433\u0434\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <\/li>\n<\/ul>\n<h4>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414<\/h4>\n<p>  \u0420\u0430\u043d\u0435\u0435, \u043c\u044b \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 MongoDB, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0432 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"https:\/\/docs.mongodb.com\/\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u041c\u044b \u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e typeorm:<\/p>\n<pre><code class=\"javascript\">\/\/\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0411\u0414 createConnection({    type: 'mongodb',    host: process.env.DB_HOST,    database: process.env.DB_NAME_DATABASE,    entities: [       User    ],    synchronize: true,    logging: false }).catch(error =&gt; console.log(error));<\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<ul>\n<li> type \u2014 \u0411\u0414 <\/li>\n<li> host \u2014 ip \u0430\u0434\u0440\u0435\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <\/li>\n<li> database \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0432 mongodb <\/li>\n<li> synchronize \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0411\u0414 <i>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0430\u0442\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c)<\/i> <\/li>\n<li> entities \u2014 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f <\/li>\n<\/ul>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0432 Node.js. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 main.ts:<\/p>\n<pre><code class=\"javascript\">import 'reflect-metadata';  import * as dotenv from 'dotenv'; import { createExpressServer } from 'routing-controllers'; import { createConnection } from 'typeorm';  import { authorizationChecker } from '.\/auth\/authorizationChecker'; import { UserController } from '.\/controllers\/UserController'; import { User } from '.\/models\/User';  dotenv.config();  \/\/\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0411\u0414 createConnection({    type: 'mongodb',    host: process.env.DB_HOST,    database: process.env.DB_NAME_DATABASE,    entities: [       User    ],    synchronize: true,    logging: false }).catch(error =&gt; console.log(error));  \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Express const app = createExpressServer({    \/\/\u041f\u0440\u0435\u0444\u0438\u043a\u0441    routePrefix: process.env.SERVER_PREFIX,    \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438    defaults: {       nullResultCode: Number(process.env.ERROR_NULL_RESULT_CODE),       undefinedResultCode: Number(process.env.ERROR_NULL_UNDEFINED_RESULT_CODE),       paramOptions: {          required: true       }    },    \/\/\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f    authorizationChecker: authorizationChecker,    \/\/\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440    controllers: [UserController] }); \/\/\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f app.listen(process.env.SERVER_PORT, () =&gt; {    console.log(process.env.SERVER_MASSAGE); });<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/h4>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c: \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c (User). \u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u043a\u0435 \u0438 \u043d\u0435 \u043e\u0434\u0438\u043d! \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0422\u043e\u043a\u0435\u043d (Token). <\/p>\n<p>  <b>User<\/b><\/p>\n<pre><code class=\"javascript\">import { ObjectID } from 'bson'; import { IsEmail, MinLength } from 'class-validator'; import { Column, Entity, ObjectIdColumn } from 'typeorm';  import { Token } from '.\/Token';  \/\/\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c @Entity() export class User {      \/\/\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440     @ObjectIdColumn()     id: ObjectID;          \/\/Email \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     @Column()     @IsEmail()     email: string;          \/\/\u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     @Column({         length: 100     })     @MinLength(2)     password: string;          \/\/\u0422\u043e\u043a\u0435\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     @Column()     token: Token; }<\/code><\/pre>\n<p>  \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 User \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0435 \u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c <i>calss-validator<\/i>, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b \u0432\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 email.<\/p>\n<p>  <b>Token<\/b><\/p>\n<pre><code class=\"javascript\">import { Column, Entity } from 'typeorm';  \/\/\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 @Entity() export class Token {      @Column()     accessToken: string;      @Column()     refreshToken: string;      @Column()     timeKill: number; }<\/code><\/pre>\n<p>  \u0411\u0430\u0437\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ev\/xl\/pu\/evxlpuuo4bajkn8c0ly1klljere.png\" alt=\"image\"\/><\/p>\n<h4>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h4>\n<p>  \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <i>authorizationChecker<\/i>(\u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043c. \u0432\u044b\u0448\u0435), \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"javascript\">import { Action, UnauthorizedError } from 'routing-controllers'; import { getMongoRepository } from 'typeorm';  import { User } from '..\/models\/User';  export async function authorizationChecker(action: Action): Promise&lt;boolean&gt; {      let token: string;     if (action.request.headers.authorization) {         \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d            token = action.request.headers.authorization.split(&quot; &quot;, 2);         const repository = getMongoRepository(User);         const allUsers = await repository.find();          for (let i = 0; i &lt; allUsers.length; i++) {             if (allUsers[i].token.accessToken.toString() === token[1]) {                 return true;             }         }     }     else {         throw new UnauthorizedError('This user has not token.');     }     return false; }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 (headers) \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: <i>Bearer 046a5f60-c55e-11e9-af71-c75526de439e<\/i>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438: true \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d, false \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d. \u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435: @Authorized(). \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f authorizationChecker, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<h4>\u041b\u043e\u0433\u0438\u043a\u0430<\/h4>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0422\u0430\u043a\u0436\u0435, \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 JSON \u0438 Query. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u043c\u0435\u0442\u043e\u0434\u044b, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043d UserService.ts. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u043d\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043e\u0447\u0435\u043d\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c DI-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0442. \u0435. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b. \u0412\u043e\u0442, \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0445\u043e\u0440\u043e\u0448\u0430\u044f <a href=\"\/\/https:\/\/habr.com\/ru\/post\/334636\/\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0437\u0430\u0434\u0430\u0447\u0435.<\/p>\n<ul>\n<li><b>\/signin [POST] <\/b> \u2014 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e. \u041d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d. \u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f MongoRepository.\n<pre><code class=\"javascript\">async userSignin(user: User): Promise&lt;string&gt; {         \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c Mongo repository         const repo = getMongoRepository(User);         \/\/\u0418\u0449\u0435\u043c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u0411\u0414         let userEmail = await repo.findOne({ email: user.email, password: user.password });          if (userEmail) {             \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d             userEmail = await this.setToken(userEmail);             \/\/\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0430\u0437\u0435             repo.save(userEmail);             return userEmail.token.accessToken;         }         return process.env.USER_SERVICE_RESPONSE;     }<\/code><\/pre>\n<\/li>\n<li> <b>\/signup [POST] <\/b> \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0442\u043e\u0436\u0435 \u0438\u0449\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u0430\u0431\u044b \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u043e\u0434\u043d\u0438\u043c email. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0431\u0430\u0437\u0443, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0430\u0432 \u0442\u043e\u043a\u0435\u043d.\n<pre><code class=\"javascript\">async userSignup(newUser: User): Promise&lt;string&gt; {         \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c Mongo repository         const repo = getMongoRepository(User);         \/\/\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 email (\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e 2 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043e\u0434\u043d\u0438\u043c email)         const userRepeat = await repo.findOne({ email: newUser.email });          if (!userRepeat) {             \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d             newUser = await this.setToken(newUser);             \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0431\u0430\u0437\u0443             const addUser = getMongoManager();             await addUser.save(newUser);             return newUser.token.accessToken;         }         else {             return process.env.USER_SERVICE_RESPONSE;         }     }<\/code><\/pre>\n<\/li>\n<li> <b>\/info [GET]<\/b> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0438\u043f id, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0439 bearer \u0442\u043e\u043a\u0435\u043d \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041a\u0430\u0440\u0442\u0438\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (header) \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0437\u0430\u0442\u0435\u043c \u0438\u0449\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u0443 \u043e\u043d \u043f\u0440\u0435\u043d\u0430\u0434 \u043b\u0435\u0436\u0438\u0442, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n<pre><code class=\"javascript\">async getUserInfo(req: express.Request): Promise&lt;User&gt; {         \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c Mongo repository         const repository = getMongoRepository(User);         \/\/\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443         const user = await this.findUser(req, repository);         return user;     }      private async findUser(req: express.Request, repository: MongoRepository&lt;User&gt;): Promise&lt;User&gt; {         if (req.get(process.env.HEADER_AUTH)) {             \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d             const token = req.get(process.env.HEADER_AUTH).split(' ', 2);             \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u0431\u0430\u0437\u044b              const usersAll = await repository.find();             \/\/\u0418\u0449\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f             for (let i = 0; i &lt; usersAll.length; i++) {                 if (usersAll[i].token.accessToken.toString() === token[1]) {                     return usersAll[i];                 }             }         }     }<\/code><\/pre>\n<p>  <\/li>\n<li><b>\/latency [GET]<\/b> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 (ping), \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0439 bearer \u0442\u043e\u043a\u0435\u043d \u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435. \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 tcp-ping.\n<pre><code class=\"javascript\">getLatency(): Promise&lt;IPingResult&gt; {         function update(progress: number, total: number): void {             console.log(progress, '\/', total);         }          const latency = ping({             address: process.env.PING_ADRESS,             attempts: Number(process.env.PING_ATTEMPTS),             port: Number(process.env.PING_PORT),             timeout: Number(process.env.PING_TIMEOUT)         }, update).then(result =&gt; {             console.log('ping result:', result);             return result;         });          return latency;     } <\/code><\/pre>\n<\/li>\n<li><b>\/logout [GET]<\/b> \u2014 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c all: true \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 bearer \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 false \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 bearer \u0442\u043e\u043a\u0435\u043d. \u041d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c query \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b. \u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e.\n<pre><code class=\"javascript\">async userLogout(all: boolean, req: express.Request): Promise&lt;void&gt; {         \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c Mongo repository         const repository = getMongoRepository(User);         \/\/\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443         const user = await this.findUser(req, repository);          if (all) {             \/\/\u0415\u0441\u043b\u0438 true \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u043a\u0435\u043d\u044b             user.token.accessToken = process.env.GET_LOGOUT_TOKEN;             user.token.refreshToken = process.env.GET_LOGOUT_TOKEN;             \/\/\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f             repository.save(user);         }         else {             \/\/\u0415\u0441\u043b\u0438 false \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439             user.token.accessToken = process.env.GET_LOGOUT_TOKEN;             \/\/\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f             repository.save(user);         }     }<\/code><\/pre>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/h4>\n<p>  \u041c\u043d\u043e\u0433\u0438\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 MVC, \u043d\u043e \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430 \u044f \u0432\u0441\u0435 \u0436\u0435 \u0441\u043a\u0430\u0436\u0443. \u0412 \u043a\u0440\u0430\u0442\u0446\u0435, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0438\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0412\u044b\u0448\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430, \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u043e\u0443\u0442\u0430\u043c\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 URI \u0438 ip \u0441\u0435\u0440\u0432\u0435\u0440\u0430 <i>(\u043f\u0440\u0438\u043c\u0435\u0440: localhost:3000\/signin)<\/i>. \u041e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430\u0445 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0440\u0430\u043d\u0435\u0435: <a href=\"https:\/\/habr.com\/ru\/users\/get\/\" class=\"user_link\">Get<\/a>, <a href=\"https:\/\/habr.com\/ru\/users\/post\/\" class=\"user_link\">POST<\/a>, @Authorized \u0438 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u044d\u0442\u043e @JsonController. \u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0438\u0448\u043a\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c JSON, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0432\u043c\u0435\u0441\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/users\/controller\/\" class=\"user_link\">Controller<\/a>. <\/p>\n<pre><code class=\"javascript\">import * as express from 'express'; import {     Authorized, Body, Get, Header, JsonController, NotFoundError, Post, QueryParam, Req,     UnauthorizedError } from 'routing-controllers';  import { IPingResult } from '@network-utils\/tcp-ping';  import { User } from '..\/models\/User'; import { UserService } from '..\/services\/UserService';  \/\/\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON @JsonController() export class UserController {    userService: UserService    \/\/\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u0442\u043a\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430    constructor() {       this.userService = new UserService();    }     \/\/\u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f    @Post('\/signin')    async login(@Body() user: User): Promise&lt;string&gt; {       const responseSignin = await this.userService.userSignin(user);       if (responseSignin !== process.env.USER_SERVICE_RESPONSE) {          return responseSignin;       }       else {          throw new NotFoundError(process.env.POST_SIGNIN_MASSAGE);       }    }     \/\/\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f    @Post('\/signup')    async registrateUser(@Body() newUser: User): Promise&lt;string&gt; {       const responseSignup = await this.userService.userSignup(newUser);       if (responseSignup !== process.env.USER_SERVICE_RESPONSE) {          return responseSignup;       }       else {          throw new UnauthorizedError(process.env.POST_SIGNUP_MASSAGE);       }    }     \/\/\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f    @Get('\/info')    @Authorized()    async getId(@Req() req: express.Request): Promise&lt;User&gt; {       return this.userService.getUserInfo(req);    }     \/\/\u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430    @Authorized()    @Get('\/latency')    getPing(): Promise&lt;IPingResult&gt; {       return this.userService.getLatency();    }     @Get('\/logout')    async deleteToken(@QueryParam(&quot;all&quot;) all: boolean, @Req() req: express.Request): Promise&lt;void&gt; {       this.userService.userLogout(all, req);    } }<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0433\u043e, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0437\u0430 <b>\u043f\u044f\u0442\u044c<\/b> \u0434\u043d\u0435\u0439 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e, \u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0443. \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u0434\u0443\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0441\u0435\u0431\u044f \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043d\u0430 \u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e. \u041d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u00ab\u044f \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439, \u0432\u044b \u0442\u0430\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435\u00bb. \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u044d\u0442\u043e \u043a\u0440\u0438\u043a \u0434\u0443\u0448\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0432\u043e\u0441\u0442\u043e\u0440\u0433\u0435 \u043e\u0442 \u043c\u0438\u0440\u0430 Node.js \u0438 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0441 \u0412\u0430\u043c\u0438 \u044d\u0442\u0438\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0442\u044c! <\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u044c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u043b \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0441\u0435\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u041d\u0435\u0442, \u0437\u043d\u0430\u043d\u0438\u044f \u041e\u041e\u041f, \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b REST API, ORM, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435. \u0418 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u043e\u043b\u0438 \u0438 \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u0441\u0442\u0438\u043b\u0435: \u00ab\u041d\u0435 \u043f\u043e\u0439\u0434\u0443 \u043d\u0430 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443, \u0442\u0430\u043c \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0435 \u0443\u0447\u0438\u043b\u00bb, \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u043d\u0435 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u0438, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0440\u0435\u0434\u044b. \u0414\u0430 \u0447\u0442\u043e \u0442\u0430\u043c \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c, \u0441\u0442\u0440\u0430\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438 \u0443 \u043c\u0435\u043d\u044f.<\/p>\n<p>  \u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438. \u0425\u043e\u0447\u0443 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u0438 \u043b\u044e\u0434\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 IT, \u043d\u0435 \u0431\u043e\u044f\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439. \u0412\u0430\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0438 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0437\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u043c\u043d\u0435), \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u044f\u0442 \u0438 \u043e\u0442\u0432\u0435\u0442\u044f\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0412\u0430\u0448\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442!<\/p>\n<p>  \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/Chessman97\/rest-auth\">\u043f\u0440\u043e\u0435\u043a\u0442<\/a><\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/466745\/\"> https:\/\/habr.com\/ru\/post\/466745\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u044d\u043c\u043e\u0446\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0432\u044b\u043a\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e REST API \u043d\u0430 Node.js \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c TypeScript, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0441 \u043d\u0443\u043b\u044f. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f: <i>\u00ab\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u0438\u043f\u043b\u043e\u043c. \u041a\u0443\u0434\u0430 \u0436\u0435 \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?\u00bb<\/i> \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u043f\u0443\u0441\u0442\u044c \u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u0438 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c. \u041f\u043e\u0437\u0432\u0430\u043b \u043a \u0441\u0435\u0431\u0435 \u043d\u0430 \u0441\u0442\u0430\u0436\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (\u0432\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a \u0442\u043e\u0439 \u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438). \u041f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u042f, \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u043b\u044b \u0438 \u043f\u043e\u0448\u0435\u043b\u2026<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m5\/rl\/yq\/m5rlyqzlhotg2fxugcj6jr1vozu.png\" alt=\"image\"\/><\/p>\n<h3>\u0414\u0435\u043d\u044c \u043f\u0435\u0440\u0432\u044b\u0439. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Node.js<\/h3>\n<p>  \u041f\u0440\u0438\u0448\u0451\u043b \u044f \u043d\u0430 back-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 IT-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 <a href=\"http:\/\/nodejs.org\">Node.js<\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c. \u042f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0431\u0435\u0436\u0430\u043b \u0432\u043f\u0435\u0440\u0435\u0434, \u0437\u0430\u0431\u044b\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e, \u0447\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043d\u0430 JavaScript (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c). \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0446\u0435\u043b\u043e\u043c \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b CRUD \u043d\u0430 Java, Python \u0438 Clojure, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043d\u044c \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u043b \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e Node.js, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/learn.javascript.ru\/screencast\/nodejs\">\u0441\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442<\/a>. <\/p>\n<p>  \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0430\u044f \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/expressjs.com\">Express<\/a>, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <a href=\"http:\/\/www.npmjs.com\">npm<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u0430\u043a package.json \u0438 tsconfig.json, \u0433\u043e\u043b\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u043b\u0430 \u043a\u0440\u0443\u0433\u043e\u043c \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0443\u0440\u043e\u043a, \u0447\u0442\u043e \u0443\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u043b\u0438\u0437\u043a\u0430\u044f \u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439. \u041a \u043a\u043e\u043d\u0446\u0443 \u0434\u043d\u044f \u044f \u0432\u0441\u0435 \u0436\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043c\u043e\u0433 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c express \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440! \u041d\u043e \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u043b \u0434\u043e\u043c\u043e\u0439 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0427\u0443\u0432\u0441\u0442\u0432\u043e, \u0447\u0442\u043e \u044f \u0443\u0442\u043e\u043f\u0430\u043b \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 JS \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u043e \u043c\u0435\u043d\u044f \u043d\u0438 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-294448","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=294448"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294448\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=294448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=294448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=294448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}