{"id":64514,"date":"2024-05-31T12:02:56","date_gmt":"2024-05-31T08:32:56","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/build-an-http-server-using-bunjs-and-prisma-3h94\/"},"modified":"2024-05-31T12:02:56","modified_gmt":"2024-05-31T08:32:56","slug":"build-an-http-server-using-bunjs-and-prisma-3h94","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/build-an-http-server-using-bunjs-and-prisma-3h94\/","title":{"rendered":"\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 BunJs \u0648 Prisma &#8211; DEV \u06cc\u06a9 \u0633\u0631\u0648\u0631 HTTP \u0628\u0633\u0627\u0632\u06cc\u062f"},"content":{"rendered":"<div data-article-id=\"1871773\" id=\"article-body\">\n<p><br \/>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0627\u0632 \u062f\u0648 \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f: BunJs \u0648 Prisma.  \u0622\u0646\u0647\u0627 \u0628\u0627 \u0647\u0645\u060c \u067e\u0627\u06cc\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648\u0628 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0645\u062f\u0631\u0646\u060c \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u0646\u062f.  \u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u0641\u0646\u06cc \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0644\u062d\u0638\u0647 \u0627\u06cc \u0631\u0627 \u062f\u0631\u06cc\u0627\u0628\u06cc\u0645 \u06a9\u0647 BunJs \u0648 Prisma \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0631\u0627 \u0628\u0647 \u0645\u06cc\u0632 \u0645\u06cc \u0622\u0648\u0631\u0646\u062f.<strong>\u0686\u0631\u0627 \u0627\u0632 BunJs \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u061f<\/strong><\/p>\n<p>BunJs \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 HTTP \u0628\u0633\u06cc\u0627\u0631 \u0633\u0628\u06a9\u060c \u0633\u0631\u06cc\u0639 \u0648 \u0628\u0633\u06cc\u0627\u0631 \u0642\u0627\u0628\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0628\u0631\u0627\u06cc Node.js \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u0628\u0647 \u0633\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u06cc\u062c\u0627\u062f \u0648\u0628 \u0633\u0631\u0648\u0631 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u0632 \u0633\u0648\u06cc \u062f\u06cc\u06af\u0631\u060c \u0628\u0627 Prisma\u060c \u0628\u0647 \u0644\u0637\u0641 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0622\u0646 \u0645\u0627\u0646\u0646\u062f \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0648 \u0628\u0631\u0631\u0633\u06cc \u0646\u0648\u0639\u060c \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u0628\u0635\u0631\u06cc\u200c\u062a\u0631 \u0648 \u06a9\u0645\u062a\u0631 \u0645\u0633\u062a\u0639\u062f \u062e\u0637\u0627 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p><strong>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0645\u0627<\/strong><\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062c\u0639\u0628\u0647 \u0627\u0628\u0632\u0627\u0631 Bun \u0631\u0627 \u0628\u0627 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645: &#8211;<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>npm install -g bun\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645: &#8211;<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\u251c\u2500\u2500 controller\/\n\u2502   \u251c\u2500\u2500 comments.controller.ts\n\u2502   \u251c\u2500\u2500 post.controller.ts\n\u2502   \u2514\u2500\u2500 user.controller.ts\n\u251c\u2500\u2500 prisma\/\n\u2502   \u2514\u2500\u2500 schema.prisma\n\u251c\u2500\u2500 services\/\n\u2502   \u251c\u2500\u2500 auth.service.ts\n\u2502   \u251c\u2500\u2500 comment.service.ts\n\u2502   \u251c\u2500\u2500 post.service.ts\n\u2502   \u2514\u2500\u2500 user.service.ts\n\u251c\u2500\u2500 docker-compose.yml\n\u251c\u2500\u2500 index.ts\n\u251c\u2500\u2500 package*.json\n\u2514\u2500\u2500 tsconfig.json\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u067e\u0648\u0634\u0647 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u060c \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u062a\u0648\u0627\u0628\u0639 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u062e\u062f\u0645\u0627\u062a \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c schema.prisma \u0634\u0627\u0645\u0644 \u0645\u062f\u0644 \u0645\u0627 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc Prisma-ORM \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.  Prisma \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641\u06cc \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 SQL \u0631\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0645\u0627 \u0627\u0632 PostgresQL \u0628\u0627 \u0646\u0645\u0648\u0646\u0647 docker \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p><strong>\u0633\u0627\u062e\u062a \u062e\u062f\u0645\u0627\u062a<\/strong><\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u062a\u0645\u0627\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>bun add -d prisma @types\/jsonwebtoken bun-types\nbun add pg jsonwebtoken elysia dotenv axios @prisma\/client @elysia\/cookie\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 prisma \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645\u060c \u0628\u0627\u06cc\u062f \u0641\u0627\u06cc\u0644 schema.prisma \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0637\u0631\u062d \u0645\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>bunx init prisma\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>bux \u0634\u0628\u06cc\u0647 npx \u06cc\u0627 pnpx \u0627\u0633\u062a. \u0647\u062f\u0641 \u0627\u0635\u0644\u06cc bux \u062a\u0633\u0647\u06cc\u0644 \u0627\u062c\u0631\u0627\u06cc \u0628\u0633\u062a\u0647\u200c\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0628\u062e\u0634 Dependencies \u06cc\u0627 devDependencies \u0641\u0627\u06cc\u0644 package.json \u067e\u0631\u0648\u0698\u0647 \u0641\u0647\u0631\u0633\u062a \u0634\u062f\u0647\u200c\u0627\u0646\u062f.  \u0628\u0647 \u062c\u0627\u06cc \u0646\u0635\u0628 \u062f\u0633\u062a\u06cc \u0627\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0633\u0631\u0627\u0633\u0631\u06cc \u06cc\u0627 \u0645\u062d\u0644\u06cc\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 bux \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0645\u0633\u062a\u0642\u06cc\u0645 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0637\u0631\u062d \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 prisma\/schema.prisma \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>generator client {\n  provider = \"prisma-client-js\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n  url      = env(\"DATABASE_URL\")\n}\n\nmodel User {\n  id        Int      @id @default(autoincrement())\n  email     String   @unique\n  name      String?\n  password  String\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u062f\u0627\u0645\u0647 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 auth.services.ts \u062e\u0648\u062f \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u067e\u0633 \u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a CRUD \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/auth.service.ts\nimport jwt from \"jsonwebtoken\";\n\nexport const verifyToken = (token: string) =&gt; {\n  let payload: any;\n\n  \/\/Verify the JWT token\n  jwt.verify(token, process.env.JWT_SECRET as string, (error, decoded) =&gt; {\n    if (error) {\n      throw new Error(\"Invalid token\");\n    }\n\n    payload = decoded;\n  });\n\n  return payload;\n};\n\nexport const signUserToken = (data: { id: number; email: string }) =&gt; {\n  \/\/Sign the JWT token\n  const token = jwt.sign(\n    {\n      id: data.id,\n      email: data.email,\n    },\n    process.env.JWT_SECRET as string,\n    { expiresIn: \"1d\" }\n  );\n\n  return token;\n};\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0627\u0628\u0639 verifyToken()\u060c \u06a9\u0647 \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u062a\u0648\u06a9\u0646 JWT \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0645\u06cc \u06af\u06cc\u0631\u062f. \u062f\u0631 \u062f\u0627\u062e\u0644 \u062a\u0627\u0628\u0639\u060c jwt.verify \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u062a\u0648\u06a9\u0646 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u062a\u0627\u0628\u0639 jwt.verify \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u0645\u0636\u0627\u06cc \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0627\u0632 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u062a\u0623\u06cc\u06cc\u062f \u062e\u0637\u0627\u06cc\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u062e\u0637\u0627\u06cc\u06cc \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646\u0647 \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06af\u0631 \u062a\u0623\u06cc\u06cc\u062f \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0627\u0634\u062f\u060c \u0628\u0627\u0631 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0645\u062a\u063a\u06cc\u0631 payload \u0627\u062e\u062a\u0635\u0627\u0635 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u062a\u0627\u0628\u0639 signUserToken() \u06cc\u06a9 \u062a\u0648\u06a9\u0646 JWT \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0645\u0639\u06cc\u0646 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u0632 jwt.sign \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u06cc\u06a9 \u062a\u0648\u06a9\u0646 \u062c\u062f\u06cc\u062f JWT \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0627\u0631 \u062a\u0648\u06a9\u0646 \u062d\u0627\u0648\u06cc \u0634\u0646\u0627\u0633\u0647 \u0648 \u0627\u06cc\u0645\u06cc\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a.  \u0627\u0632 \u0631\u0645\u0632 JWT \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 process.env.JWT_SECRET \u0628\u0631\u0627\u06cc \u0627\u0645\u0636\u0627\u06cc \u062a\u0648\u06a9\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0646\u0642\u0636\u0627\u06cc \u0627\u06cc\u0646 \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0631\u0648\u06cc 1D \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0627 \u0645\u06a9\u0627\u0646\u06cc\u0632\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0627 \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f user.service.ts \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/user.service.ts\nimport { prisma } from \"..\/index\";\nimport { signUserToken } from \".\/auth.service\";\n\nexport const createNewUser = async (data: {\n  name: string;\n  email: string;\n  password: string;\n}) =&gt; {\n  try {\n    const { name, email, password } = data;\n\n    \/\/Hash the password using the Bun package and bcrypt algorithm\n    const hashedPassword = await Bun.password.hash(password, {\n      algorithm: \"bcrypt\",\n    });\n\n    \/\/Create the user\n    const user = await prisma.user.create({\n      data: {\n        name,\n        email,\n        password: hashedPassword,\n      },\n    });\n\n    return user;\n  } catch (error) {\n    throw error;\n  }\n};\n\nexport const login = async (data: { email: string; password: string }) =&gt; {\n  try {\n    const { email, password } = data;\n\n    \/\/Find the user\n    const user = await prisma.user.findUnique({\n      where: {\n        email,\n      },\n    });\n\n    if (!user) {\n      throw new Error(\"User not found\");\n    }\n\n    \/\/Verify the password\n    const valid = await Bun.password.verify(password, user.password);\n\n    if (!valid) {\n      throw new Error(\"Invalid credentials\");\n    }\n\n    \/\/ \/\/Sign the JWT token\n    const token = signUserToken({\n      id: user.id,\n      email: user.email,\n    });\n\n    return {\n      message: \"User logged in successfully\",\n      token,\n    };\n  } catch (error) {\n    throw error;\n  }\n};\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u062f\u0648 \u062a\u0627\u0628\u0639 \u062f\u0627\u0631\u06cc\u0645: &#8211; createNewUser \u0648 login.  \u062a\u0627\u0628\u0639 createNewuser \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u062c\u0645\u0644\u0647 \u0646\u0627\u0645\u060c \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0648\u0631\u0648\u062f\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 BunJs \u0648 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 bcrypt \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u06cc\u0645\u0646 \u0647\u0634 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0633\u067e\u0633 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u0634 user.create \u062f\u0631 Prisma ORM \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0647\u0634 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0646\u0627\u0645 \u0648 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f.  \u0627\u06af\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u0648\u062f\u060c \u0634\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f\u060c \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062e\u0637\u0627 \u0631\u0627 \u067e\u0631\u062a\u0627\u0628 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647\u060c \u062a\u0627\u0628\u0639 \u0648\u0631\u0648\u062f \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u0634 user.findUnique Prisma-ORM \u067e\u06cc\u062f\u0627 \u06a9\u0646\u062f.  \u0627\u06af\u0631 \u06a9\u0627\u0631\u0628\u0631 \u067e\u06cc\u062f\u0627 \u0646\u0634\u0648\u062f\u060c \u06cc\u06a9 \u062e\u0637\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.  \u0627\u06af\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u067e\u0633\u0648\u0631\u062f \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0647\u0634 \u0634\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u0634 password.verify \u0628\u0633\u062a\u0647 BunJs \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.  \u067e\u0633 \u0627\u0632 \u062a\u0623\u06cc\u06cc\u062f \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632\u060c \u06cc\u06a9 \u062a\u0648\u06a9\u0646 JWT \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0627\u0628\u0639 signUserToken \u0627\u0632 auth.service \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0634\u0646\u0627\u0633\u0647 \u0648 \u0627\u06cc\u0645\u06cc\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.  \u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u062a\u0648\u06a9\u0646 JWT \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631 \u0645\u0627 \u0648 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0627 \u0645\u06a9\u0627\u0646\u06cc\u0632\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0634\u062f\u0647 \u0648 \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0645\u0627 \u0628\u0647 \u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 \u0645\u0633\u06cc\u0631 \u062e\u0648\u062f \u062f\u0631 controller\/user.controller.ts \u0627\u062f\u0627\u0645\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f:-<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/user.controller.ts\nimport Elysia from \"elysia\";\nimport { createNewUser, login } from \"..\/services\/user.service\";\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Elysia \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc HTTP \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.  \u0647\u0645\u0686\u0646\u06cc\u0646 \u062a\u0648\u0627\u0628\u0639 createNewUser \u0648 login \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 user.service \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u062b\u0628\u062a \u0646\u0627\u0645 \u0648 \u0648\u0631\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>app.post(\"\/signup\", async (context) =&gt; {\n  try {\n    const userData: any = context.body;\n\n    const newUser = await createNewUser({\n      name: userData.name,\n      email: userData.email,\n      password: userData.password,\n    });\n\n    return {\n      user: newUser,\n    };\n  } catch (error: any) {\n    return {\n      error: error.message,\n    };\n  }\n});\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\/signup \u06cc\u06a9 \u0645\u0633\u06cc\u0631 POST \u0627\u0633\u062a \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062f\u0631 \u0628\u062f\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0631\u062f.  \u062f\u0631 \u062f\u0627\u062e\u0644 \u0647\u062f\u0627\u06cc\u062a\u06af\u0631 \u0645\u0633\u06cc\u0631\u060c \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0627\u0632 \u0628\u062f\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc \u06a9\u0646\u062f.  \u0648 \u0633\u067e\u0633 \u062a\u0627\u0628\u0639 createNewUser \u0631\u0627 \u0627\u0632 user.service.ts \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0634\u062f\u0647 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0627\u0631\u0628\u0631 \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0627\u0634\u062f\u060c \u0634\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u062e\u0637\u0627\u06cc\u06cc \u0631\u062e \u062f\u0647\u062f\u060c \u062e\u0637\u0627 \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u062f\u060c \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0631\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u062b\u0628\u062a \u0646\u0627\u0645\u060c \u0645\u0633\u06cc\u0631 \u0628\u0639\u062f\u06cc \/ \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u06cc \u0622\u06cc\u062f:-<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>app.post(\"\/login\", async (context) =&gt; {\n  try {\n    const userData: any = context.body;\n\n    const loggedInUser = await login({\n      email: userData.email,\n      password: userData.password,\n    });\n\n    return loggedInUser;\n  } catch (error: any) {\n    console.log(error);\n    return {\n      error: error.message,\n    };\n  }\n});\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u062a\u0627\u0628\u0639 \u0648\u0631\u0648\u062f \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0634\u062f\u0647 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0627\u06af\u0631 \u0648\u0631\u0648\u062f \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0627\u0634\u062f\u060c \u0634\u06cc\u0621 \u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u06cc\u06a9 \u062a\u0648\u06a9\u0646 JWT \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0648\u0631\u0648\u062f \u062e\u0637\u0627\u06cc\u06cc \u0631\u062e \u062f\u0647\u062f\u060c \u062e\u0637\u0627 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f\u060c \u0622\u0646 \u0631\u0627 \u062f\u0631 \u06a9\u0646\u0633\u0648\u0644 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f\u060c \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0631\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u062f\u0631 \u062c\u0627\u06cc \u062e\u0648\u062f \u0648 \u0622\u0645\u0627\u062f\u0647 \u0627\u062c\u0631\u0627 \u062f\u0627\u0631\u06cc\u0645\u060c \u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0622\u0646 \u0628\u0647 \u0641\u0627\u06cc\u0644 index.ts \u0648 docker-compose.yml \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645.  \u0641\u0627\u06cc\u0644 docker-compose \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0648 \u0627\u062c\u0631\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 postgres \u0645\u062d\u062a\u0648\u0627 \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>version: '3.9'\nservices:\n    postgres:\n        image: postgres:latest\n        restart: always\n        environment:\n          - POSTGRES_DB=postgres\n          - POSTGRES_USER=postgres\n          - POSTGRES_PASSWORD=password\n        ports:\n          - '5432:5432'\n        volumes:\n          - .\/sql\/init.sql:\/docker-entrypoint-initdb.d\/init.sql\n        networks:\n          - keploy-network\n\nnetworks:\n  keploy-network:\n    external: true\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0641\u0627\u06cc\u0644 index.ts \u0645\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/index.ts\nimport Elysia from \"elysia\";\nimport { PrismaClient } from \"@prisma\/client\";\nimport { userController } from \".\/controllers\/user.controller\";\n\n\/\/Create instances of prisma and Elysia\nconst prisma = new PrismaClient();\nconst app = new Elysia();\n\n\/\/Use controllers as middleware\napp.use(userController as any);\n\n\/\/Listen for traffic\napp.listen(4040, () =&gt; {\n  console.log(\"\ud83e\udd8a Elysia is running at localhost:4040\");\n});\n\nexport { app, prisma };\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0641\u0627\u06cc\u0644 index.ts \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f\u06cc \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0646\u0645\u0648\u0646\u0647 \u0647\u0627\u06cc \u0633\u0631\u0648\u0631 \u0648 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627 \u062b\u0628\u062a \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u0628\u0647 \u06af\u0648\u0634 \u062f\u0627\u062f\u0646 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u062a\u0646\u0638\u06cc\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0647\u0645\u0627\u0647\u0646\u06af \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0646\u0645\u0648\u0646\u0647 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0645\u0627\u0698\u0648\u0644 \u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0635\u0627\u062f\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0633\u0631\u0648\u0631 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>bun run dev\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\ud83e\udd8a Elysia is running at localhost:4040\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0646\u062a\u06cc\u062c\u0647<\/strong><\/p>\n<p>\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 BunJs \u0627\u06cc\u062c\u0627\u062f \u0633\u0631\u0648\u0631 \u0631\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 Prisma \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u0633\u0631\u0648\u0631 BunJs \u0633\u0627\u062f\u0647 \u0628\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0648\u06a9\u0646\u200c\u0647\u0627\u06cc JWT \u0631\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u0645\u060c \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u062b\u0628\u062a \u0646\u0627\u0645 \u0648 \u0648\u0631\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Elysia \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645.<\/p>\n<p>\u062f\u0631 \u0642\u0633\u0645\u062a \u0628\u0639\u062f\u06cc \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 bun-test\u060c cucumber \u0648 keploy \u062a\u0633\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u06cc\u0627\u062f \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645 \u06a9\u0647 \u0627\u0632 \u06a9\u062f\u0627\u0645 \u06cc\u06a9 \u0628\u0647\u062a\u0631 \u0627\u0633\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n<p><strong>\u0633\u0648\u0627\u0644\u0627\u062a \u0645\u062a\u062f\u0627\u0648\u0644<\/strong><\/p>\n<p><strong>\u0686\u0631\u0627 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u0647\u0627\u06cc JWT \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645\u061f<\/strong><\/p>\n<p>\u062a\u0648\u06a9\u0646\u200c\u0647\u0627\u06cc JWT \u0631\u0627\u0647\u06cc \u0627\u0645\u0646 \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.  \u0622\u0646\u0647\u0627 \u0628\u062f\u0648\u0646 \u062d\u0627\u0644\u062a \u0647\u0633\u062a\u0646\u062f\u060c \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u06a9\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0647\u06cc\u0686 \u062c\u0644\u0633\u0647 \u0627\u06cc \u062f\u0631 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0633\u062a \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a.  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0622\u0646\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u062d\u0627\u0648\u06cc \u0627\u062f\u0639\u0627\u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0627\u0634\u0646\u062f \u0648 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc\u200c\u062f\u0647\u0646\u062f \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0628\u0627\u0631 \u062a\u0648\u06a9\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0646\u062f.<\/p>\n<p><strong>Bunx \u0686\u06cc\u0633\u062a \u0648 \u0686\u0647 \u062a\u0641\u0627\u0648\u062a\u06cc \u0628\u0627 \u0633\u0627\u06cc\u0631 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0628\u0633\u062a\u0647 \u062f\u0627\u0631\u062f\u061f<\/strong><\/p>\n<p>Bunx \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0627\u062c\u0631\u0627\u06cc \u0628\u0633\u062a\u0647 \u0645\u0634\u0627\u0628\u0647 npx \u06cc\u0627 pnpx \u0627\u0633\u062a.  \u0647\u062f\u0641 \u0627\u0635\u0644\u06cc \u0622\u0646 \u062a\u0633\u0647\u06cc\u0644 \u0627\u062c\u0631\u0627\u06cc \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0641\u0647\u0631\u0633\u062a \u0634\u062f\u0647 \u062f\u0631 \u0628\u062e\u0634 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u06cc\u0627 devDependencies \u067e\u0631\u0648\u0698\u0647 \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0646\u0635\u0628 \u062f\u0633\u062a\u06cc \u0627\u0633\u062a.  Bunx \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0631\u0627 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u0628\u0633\u062a\u0647 \u0647\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0627\u0632 \u0645\u062a\u0646 \u067e\u0631\u0648\u0698\u0647 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><strong>\u062f\u0631 \u0642\u0633\u0645\u062a \u0628\u0639\u062f\u06cc \u0648\u0628\u0644\u0627\u06af \u0628\u0647 \u0686\u0647 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u062a\u0633\u062a\u06cc \u067e\u0631\u062f\u0627\u062e\u062a\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f\u061f<\/strong><\/p>\n<p>\u062f\u0631 \u0642\u0633\u0645\u062a \u0628\u0639\u062f\u06cc \u0648\u0628\u0644\u0627\u06af\u060c \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u062a\u0633\u062a \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Keploy\u060c bun test \u0648 CucumberJs \u0628\u0631\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.  \u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0631\u0648\u06cc\u06a9\u0631\u062f\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f \u0648 \u0645\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u0642\u0627\u0637 \u0642\u0648\u062a \u0648 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0622\u0646\u0647\u0627 \u0635\u062d\u0628\u062a \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p><strong>\u0622\u06cc\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0628\u0647 BunJs \u0648 Prisma \u06a9\u0645\u06a9 \u06a9\u0646\u0645\u061f<\/strong><\/p>\n<p>\u0647\u0631 \u062f\u0648 BunJs \u0648 Prisma \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0647\u0633\u062a\u0646\u062f \u0648 \u0627\u0632 \u0645\u0634\u0627\u0631\u06a9\u062a \u067e\u0630\u06cc\u0631\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f!  \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0631\u0633\u0627\u0644 \u06af\u0632\u0627\u0631\u0634\u200c\u0647\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u06cc\u0698\u06af\u06cc\u060c \u06cc\u0627 \u062d\u062a\u06cc \u0645\u0634\u0627\u0631\u06a9\u062a \u06a9\u062f \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u062e\u0627\u0632\u0646 \u0645\u0631\u0628\u0648\u0637\u0647 GitHub \u0645\u0634\u0627\u0631\u06a9\u062a \u06a9\u0646\u06cc\u062f.  \u0628\u0631\u0627\u06cc \u06a9\u0633\u0628 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0645\u0634\u0627\u0631\u06a9\u062a\u060c \u062d\u062a\u0645\u0627\u064b \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644\u200c\u0647\u0627\u06cc \u0645\u0634\u0627\u0631\u06a9\u062a \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0627\u0632 \u062f\u0648 \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f: BunJs \u0648 Prisma. \u0622\u0646\u0647\u0627 \u0628\u0627 \u0647\u0645\u060c \u067e\u0627\u06cc\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648\u0628 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0645\u062f\u0631\u0646\u060c \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u0641\u0646\u06cc \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0644\u062d\u0638\u0647 \u0627\u06cc \u0631\u0627 \u062f\u0631\u06cc\u0627\u0628\u06cc\u0645 \u06a9\u0647 BunJs \u0648 Prisma \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0631\u0627 \u0628\u0647 \u0645\u06cc\u0632 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":64515,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-64514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/64514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=64514"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/64514\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/64515"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=64514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=64514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=64514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}