uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
+230 kunlar
Postlar arxiv
ToCode
1 419
# ืฆืขื“ื™ื ืจืืฉื•ื ื™ื ืขื grpc ืกืคืจื™ื™ืช gRPC ื”ื™ื ืกืคืจื™ื™ืช ืงื•ื“ ืคืชื•ื— ืžื‘ื™ืช ื’ื•ื’ืœ ืฉืชืคืงื™ื“ื” ืœื—ื‘ืจ ื‘ื™ืŸ ืกืจื‘ื™ืกื™ื ื‘ืžืขืจื›ืช ืฉืœื›ื ื‘ืฆื•ืจื” ื™ืขื™ืœื” ื•ืžื”ื™ืจื”. ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœื™ื” ื‘ืชื•ืจ ืชื—ืœื™ืฃ ืžื”ื™ืจ ื™ื•ืชืจ ืœ REST APIs ื›ืืฉืจ ื”ืจื•ื•ื— ื”ืžืจื›ื–ื™ ืฉืœ gRPC ืžื‘ื—ื™ื ืช ื‘ื™ืฆื•ืขื™ื ืžื’ื™ืข ืžื”ืฉื™ืžื•ืฉ ื‘ HTTP/2 ื•ื‘ืฉืœื™ื˜ื” ื˜ื•ื‘ื” ื™ื•ืชืจ ืฉืœ ื”ืกืคืจื™ื” ื‘ืคืจื•ื˜ื•ืงื•ืœ. ืžื‘ื—ื™ื ืช ื—ื•ื•ื™ืช ืžืฉืชืžืฉ ื”ืกืคืจื™ื” ืžืืคืฉืจืช ื›ืชื™ื‘ืช ืชื•ื›ื ื™ื•ืช ืžื‘ื•ื–ืจื•ืช ื›ืื™ืœื• ืื ื—ื ื• ืจืฆื™ื ืขืœ ืื•ืชื” ืžื›ื•ื ื” ื‘ืืžืฆืขื•ืช ืฉื™ืžื•ืฉ ื ืจื—ื‘ ื‘ Stub-ื™ื. ื”ืกืคืจื™ื” ืžื’ื™ืขื” ืขื ืชืžื™ื›ื” ืจืฉืžื™ืช ื‘ 11 ืฉืคื•ืช ืชื›ื ื•ืช ื•ืืคืฉืจ ืœืžืฆื•ื ื—ื™ื‘ื•ืจื™ื ืœืขื•ื“ ืขืฉืจื•ืช ื‘ื—ื™ืคื•ืฉ ืคืฉื•ื˜ ื‘ืจืฉืช. ื‘ืคื•ืกื˜ ื–ื” ืืฆื™ื’ ืฉืชื™ ื“ื•ื’ืžืื•ืช ื‘ืฉืคืช Python ืœืฉื™ืžื•ืฉ ื‘ gRPC ื‘ื”ืชื—ืœื” ื›ื“ื™ ืœื›ืชื•ื‘ ืฉืจืช Echo ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืคื•ืš ืื•ืชื• ืœ Chat. ## ื”ืชืงื ื” ื‘ื”ื ื—ื” ืฉื™ืฉ ืœื›ื python3 ืžืงื•ื ืคื’ ื›ืžื• ืฉืฆืจื™ืš ืืคืฉืจ ืœื”ืชืงื™ืŸ ื”ื›ืœ ืขื ืคืงื•ื“ืช pip ืคืฉื•ื˜ื”:
$ pip install grpclib protobuf grpcio-tools
ื‘ื›ืชื™ื‘ืช ืงื•ื“ gRPC ืื ื—ื ื• ืžืชื—ื™ืœื™ื ื‘ื›ืชื™ื‘ืช ืงื•ื‘ืฅ ืคืจื•ื˜ื•ืงื•ืœ (ืขื ืกื™ื•ืžืช proto) ื•ืื– ืžืฉืชืžืฉื™ื ื‘ืฉืคื” ืฉื‘ื—ืจื ื• ื›ื“ื™ ืœื™ืฆื•ืจ ืงื•ื“ ืกื˜ืื‘ ืขื‘ื•ืจ ื”ืคืจื•ื˜ื•ืงื•ืœ ืœืคืจื•ื™ืงื˜ ืฉืœื ื•. ื–ื” ืื•ืžืจ ืฉืœื›ืœ ืงื•ื‘ืฅ ืคืจื•ื˜ื•ืงื•ืœ ื™ื”ื™ื• ืœื ื• ืฉื ื™ ืงื‘ืฆื™ื ืžื’'ื•ื ืจื˜ื™ื ืื•ืชื ื ื˜ืขืŸ ืžื”ืงื•ื“, ื•ื›ืœ ืคืขื ืฉืžืฉื ื™ื ืืช ื”ืคืจื•ื˜ื•ืงื•ืœ ืฆืจื™ืš ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืคืงื•ื“ื” ืฉืžื™ื™ืฆืจืช ืืช ืื•ืชื ืฉื ื™ ืงื‘ืฆื™ื. ืงื•ื‘ืฅ ืคืจื•ื˜ื•ืงื•ืœ ืฉืœ gRPC ืžืชืืจ ืืช ื”ืชืงืฉื•ืจืช ื‘ื™ืŸ ื”ืฉืจืช ืœืœืงื•ื— - ื•ื‘ื˜ืจืžื™ื ื•ืœื•ื’ื™ื” ื”ื–ืืช ื”ืœืงื•ื— ืคื•ื ื” ืœืฉืจืช ื•ืžื‘ืงืฉ ืœื”ืจื™ืฅ ืงื•ื“ ืžืกื•ื™ื, ื”ืฉืจืช ืžืจื™ืฅ ืืช ื”ืงื•ื“ ื•ืฉื•ืœื— ื—ื–ืจื” ืชืฉื•ื‘ื”. ืคืจื•ื˜ื•ืงื•ืœ ื”ืชืงืฉื•ืจืช ืžื•ืจื›ื‘ ืžืจืฉื™ืžืช ื”ืคื•ื ืงืฆื™ื•ืช ืฉื”ืฉืจืช ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ื•ืจืฉื™ืžืช ื”ืคืจืžื˜ืจื™ื ืฉืœ ื›ืœ ืคื•ื ืงืฆื™ื”. ## ืชื•ื›ื ื™ืช ืจืืฉื•ื ื”: ืฉืจืช Echo ื”ื ื” ืœื“ื•ื’ืžื” ืชื•ื›ื ื™ืช ืจืืฉื•ื ื” ืชื”ื™ื” ืชื•ื›ื ื™ืช Echo, ื›ืœื•ืžืจ ืชื”ื™ื” ืœื ื• ืคื•ื ืงืฆื™ื” ืื—ืช ืขืœ ื”ืฉืจืช ืฉื‘ืกืš ื”ื›ืœ ืชืฉืœื— ืœืœืงื•ื— ื—ื–ืจื” ื‘ื“ื™ื•ืง ืืช ืžื” ืฉื”ื•ื ืฉืœื— ืืœื™ื™. ืงื•ื‘ืฅ ื”ืคืจื•ื˜ื•ืงื•ืœ ืฉืœ ื”ืชื•ื›ื ื™ืช ื”ื•ื:
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string text = 1;
}

message HelloReply {
  string message = 1;
}
ื‘ืชืจื’ื•ื ืœืขื‘ืจื™ืช: 1. ื”ืžื™ืœื” service ืžื’ื“ื™ืจื” ืื•ืกืฃ ืคืขื•ืœื•ืช ืฉืฉืจืช ื™ื•ื“ืข ืœืขืฉื•ืช (ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœ ื–ื” ื› Class ื‘ืฉืจืช). 2. ื”ืžื™ืœื” message ืžื’ื“ื™ืจื” ื”ื•ื“ืขื” ืฉืคืขื•ืœื” ื™ื•ื“ืขืช ืœืงื‘ืœ ืื• ืœื”ื—ื–ื™ืจ. 3. ื‘ืชื•ืš message ืืคืฉืจ ืœื›ืชื•ื‘ ืžืกืคืจ ืฉื“ื•ืช ืฉื™ื”ื™ื• ื‘ื”ื•ื“ืขื”. ืœื›ืœ ืฉื“ื” ื™ืฉ ืžืกืคืจ ื•ืกื•ื’. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ืžื—ืœืงื” ืขืœ ื”ืฉืจืช ื ืงืจืืช Greeter ื•ื”ื™ื ื—ื•ืฉืคืช ืคื•ื ืงืฆื™ื” ืื—ืช ื‘ืฉื SayHello. ืคื•ื ืงืฆื™ื” ื–ื• ืžืงื‘ืœืช ื”ื•ื“ืขื” ืžืกื•ื’ HelloRequest ื•ืžื—ื–ื™ืจื” ื”ื•ื“ืขื” ืžืกื•ื’ HelloReply. ืฉืชื™ ื”ื”ื•ื“ืขื•ืช ืžื•ื’ื“ืจื•ืช ื‘ื”ืžืฉืš ื”ืงื•ื‘ืฅ, ืœืฉืชื™ื”ืŸ ืฉื“ื” ืื—ื“ ืžืกื•ื’ ื˜ืงืกื˜ ืื‘ืœ ืขื ืฉื ืฉื•ื ื”. ืžื™ื˜ื™ื‘ื™ ื”ืœื›ืช ื‘ื™ืŸ ื”ืงื•ืจืื™ื ืžื•ื–ืžื ื™ื ืœืžืฆื•ื ืืช ื”ื”ื•ืจืื•ืช ื”ืžืœืื•ืช ืœื›ืชื™ื‘ืช ืงื‘ืฆื™ proto ื‘ืชื™ืขื•ื“ ืฉืœื”ื ื‘ืงื™ืฉื•ืจ: https://developers.google.com/protocol-buffers/docs/proto3. ืื—ืจื™ ืฉื›ืชื‘ื ื• ืืช ืงื•ื‘ืฅ ื” proto ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื™ื™ืฆืจ ืžืžื ื• ืืช ืงื‘ืฆื™ ื”ืกื˜ืื‘. ื‘ืคื™ื™ืชื•ืŸ ืื ื™ ืจื•ืฉื ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ python -m grpc_tools.protoc -I. --python_out=. --grpclib_python_out=. sayhello.proto
ื–ื” ื™ื™ืฆื•ืจ ืืช ื”ืงื‘ืฆื™ื sayhello_grpc.py ื• sayhello_pb2.py, ืฉื ื™ื”ื ืœื ื ื•ืขื“ื• ืœื‘ื ื™ ืื“ื. ืื ื—ื ื• ืคืฉื•ื˜ ื ืฉืœื‘ ืื•ืชื ื‘ืชื•ื›ื ื™ืช ื” Python ืฉืœื ื• ื›ื“ื™ ืœื—ื‘ืจ ื‘ื™ืŸ ื”ืฉืจืช ืœืœืงื•ื—. ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืงื•ื“ ืฆื“ ืฉืจืช gRPC ืื ื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืžื—ืœืงื” ืฉืชืžืžืฉ ืืช ื”ืคื•ื ืงืฆื™ื•ืช ืฉื”ื’ื“ืจืชื™ ื‘ืคืจื•ื˜ื•ืงื•ืœ. ืื ื™ ืžืฉืชืžืฉ ื‘ื‘ืกื™ืก ืฉื ื•ืฆืจ ืขื‘ื•ืจื™ ื‘ืงื•ื‘ืฅ sayhello_grpc.py ื•ืžืจื—ื™ื‘ ืื•ืชื•. ืžื—ืœืงืช ืฆื“ ืฉืจืช ื ืจืื™ืช ื›ืš:
class Greeter(GreeterBase):
    async def SayHello(self, stream):
        request = await stream.recv_message()
        message = f'You Said: "{request.text}"'
        await stream.send_message(HelloReply(message=message))
ื”ืคื•ื ืงืฆื™ื” SayHello ืžืชืื™ืžื” ืœืคื•ื ืงืฆื™ื” ืฉื”ื’ื“ืจืชื™ ื‘ืงื•ื‘ืฅ ื”ืคืจื•ื˜ื•ืงื•ืœ. ื”ืคืจืžื˜ืจ stream ื”ื•ื ืฉืžืืคืฉืจ ืœื™ ืœื‘ืฆืข ืคืขื•ืœื•ืช ื”ืงืฉื•ืจื•ืช ืœืคืจื•ื˜ื•ืงื•ืœ ื•ื‘ืžืงืจื” ืฉืœื ื• stream.recv_message() ืžืงื‘ืœืช ืืช ื”ื‘ืงืฉื” ืžื”ืœืงื•ื— ื• stream.send_message ืฉื•ืœื—ืช ืืช ื”ืชืฉื•ื‘ื”. ื–ื” ืžื‘ื ื” ืžืขื ื™ื™ืŸ ื›ื™ ื‘ื“ืจืš ื›ืœืœ ืื ื—ื ื• ื—ื•ืฉื‘ื™ื ืขืœ ืคื•ื ืงืฆื™ื” ื‘ืชื•ืจ ืžืฉื”ื• ืฉ"ืžื—ื–ื™ืจ" ืขืจืš, ื•ืคื” ื‘ื’ืœืœ ืฉืžื“ื•ื‘ืจ ื‘ืคืขื•ืœื” ืžื‘ื•ื–ืจืช ื”ื—ื–ืจืช ื”ืขืจืš ื”ื™ื ืœืžืขืฉื” ืฉืœื™ื—ืช ื”ื•ื“ืขื” ื—ื–ืจื” ืขื ื”ืขืจืš ื”ื—ื•ื–ืจ, ื‘ืžืงื•ื ืคืงื•ื“ืช return. ืงื•ื“ ืฆื“ ื”ืฉืจืช ื”ืžืœื ืขื ื”ืงื•ื“ ืฉืžืคืขื™ืœ ืืช ื”ืžื—ืœืงื” ื ืจืื” ื›ืš:
# File: server.py

import asyncio

from grpclib.utils import graceful_exit
from grpclib.server import Server

# generated by protoc
from sayhello_pb2 import HelloReply
from sayhello_grpc import GreeterBase


class Greeter(GreeterBase):
    async def SayHello(self, stream):
        request = await stream.recv_message()
        message = f'You Said: "{request.text}"'

ToCode
1 419
# ื–ื”ื™ืจื•ืช - ืงื•ื“ ืขื•ื‘ื“ ืœืคื ื™ืš! ื”ืžื“ื“ ื”ื›ื™ ื’ืจื•ืข ืœืื™ื›ื•ืช ืงื•ื“ ื”ื•ื "ืขื•ื‘ื“/ืœื ืขื•ื‘ื“" ื•ืื ื™ ืชืžื™ื“ ืืขื“ื™ืฃ ืงื•ื“ ื ื›ื•ืŸ ืฉืœื ืขื•ื‘ื“ ืขืœ ืคื ื™ ืงื•ื“ ืขื•ื‘ื“ ื•ืœื ื ื›ื•ืŸ. ื•ืขื ื–ื” ื”ืœื›ืชื™ ืœืงืฉืงืฉ ืงืฆืช ืขื JavaScript ื”ื™ื•ื ื•ื‘ืคืจื˜ ืขื testing-library. ืฉื™ืžื• ืœื‘ ืœื‘ื“ื™ืงื” ื”ื‘ืื” ืฉืขื•ื‘ืจืช:
it('Increases after I click the button', async () => {
  const screen = render(Counter);
  const button = screen.getByRole('button', { name: 'Click Here' });
  await userEvent.click(button);

  expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ื–ื” ืงื•ื“ ื‘ื“ื™ืงื” ืœืžื•ื ื” ืœื—ื™ืฆื•ืช ืฉืžื•ื•ื“ื ืฉืื—ืจื™ ืฉืœื—ืฆืชื™ ืขืœ ื›ืคืชื•ืจ ื™ื•ืคื™ืข ื”ื˜ืงืกื˜ clicked 1 times. ื—ื“ื™ ื”ืขื™ืŸ ืฉื‘ื™ืŸ ื”ืงื•ืจืื™ื ื™ื›ื•ืœื™ื ืœืจืื•ืช ืืช ื”ื‘ืขื™ื” ื‘ืฉื•ืจื” ื”ืจื‘ื™ืขื™ืช ืฉืœ ื”ืงื•ื“:
await userEvent.click(button);
ื–ื” ืจืขื™ื•ืŸ ื™ืคื” ืจืง ืฉ userEvent.click ืœื ืžื—ื–ื™ืจ Promise. ืงื•ื“ ื”ื‘ื“ื™ืงื” ื”ื‘ื (ืฉื’ื ืขื•ื‘ื“) ื”ื•ื ืฉืงื•ืœ ืœืชื•ื›ื ื™ืช ื”ืจืืฉื•ื ื”:
it('Increases after I click the button', async () => {
  const screen = render(Counter);
  const button = screen.getByRole('button', { name: 'Click Here' });
  userEvent.click(button);
  await undefined;

  expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ืื” ื•ืฆืจื™ืš ืœืฆื™ื™ืŸ - ืื ืžื•ื—ืงื™ื ืืช ืฉื•ืจืช ื” await ื•ื ืฉืืจื™ื ืจืง ืขื ื–ื”:
it('Increases after I click the button', async () => {
  const screen = render(Counter);
  const button = screen.getByRole('button', { name: 'Click Here' });
  userEvent.click(button);

  expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ื”ื‘ื“ื™ืงื” ื ื›ืฉืœืช. ืœืžืขืฉื” ื”ืงืจื™ืื” ืœ await undefined, ื‘ื“ื™ื•ืง ื›ืžื• ื’ื™ืจืกื” ืžื‘ื•ืกืกืช ื”ื‘ื˜ื—ื•ืช ืฉืœ setTimeout(0) ื”ื™ื ื“ืจืš ืœืคืฆืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืœืฉื ื™ ื—ืœืงื™ื ื•ืœืชืช ืœืžื ื•ืข "ืœื ืฉื•ื" ื‘ื™ืŸ ืฉื ื™ื”ื ื›ื“ื™ ืฉื”ื•ื ื™ื•ื›ืœ ืœืกื™ื™ื ืคืขื•ืœื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช ืื—ืจื•ืช. ื•ื–ื” ืจืง ืขื ื™ื™ืŸ ืฉืœ ืžื–ืœ ื•ืฉืœ ืžื™ืžื•ืฉ ืžื ื•ืข JavaScript ืกืคืฆื™ืคื™ ื‘ื’ืœืœื• ื”ืงื•ื“ ื”ื–ื” ืขื‘ื“. ืžื” ืฆืจื™ืš ื‘ืžืงื•ื? ืœื”ื‘ื™ืŸ ืฉื”ื‘ืขื™ื” ื”ื™ื ืœื ื‘ click ืืœื ื‘ื–ืžืŸ ืฉ Vue ืฆืจื™ืš ืื—ืจื™ ื” click ื›ื“ื™ ืœืขื“ื›ืŸ ืืช ื”ืžืžืฉืง, ื•ืœื”ื•ืกื™ืฃ ืืช ื”ื”ืžืชื ื” ื‘ืฉื•ืจื” ื”ื‘ืื” ืฉืžื—ืคืฉืช ืืช ื”ืืœืžื ื˜. ืงื•ื“ ื‘ืจื•ืจ ื•ื ื›ื•ืŸ ื™ื•ืชืจ ืœืื•ืชื” ื‘ื“ื™ืงื” ื™ืจืื” ื›ืš:
it('Increases after I click the button', async () => {
  const screen = render(Counter);
  const button = screen.getByRole('button', { name: 'Click Here' });
  userEvent.click(button);

  expect(screen.findByText(/clicked 1 times/)).toBeTruthy();
});

ToCode
1 419
# ืขื•ืฉื” ืœื™ ืฆืจื‘ืช ืืฃ ืคืขื ืœื ื”ืฆืœื—ืชื™ ืœื”ื‘ื™ืŸ ืœืžื” ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืžืกื•ื™ืžื•ืช ื ืจืื• ืœื™ ืžื•ืฉืœืžื•ืช ืžื”ืฉื ื™ื” ื”ืจืืฉื•ื ื” ืื™ืชืŸ (ืืœื™ืงืกื™ืจ, ื•ื™ื, ืคืจืœ), ื•ืื—ืจื•ืช (ื’ื™ื˜, ืคื™ื™ืชื•ืŸ, ืงื•ื‘ืจื ื˜ืก) ืขืฉื• ืœื™ ื—ืฉืง ืœื”ืชื—ื‘ื ืžืื—ื•ืจื™ ืื™ื–ื” ืกืœืข ืขื“ ืฉื”ื˜ืจื ื“ ื™ืขื‘ื•ืจ ื•ื”ืŸ ื™ืขืœืžื• ืžื”ืขื•ืœื. ืื‘ืœ ื–ื” ื”ืžืฆื‘ ื•ืื ื™ ื‘ื˜ื•ื— ืฉื’ื ืืชื ืžื›ื™ืจื™ื ืืช ืฉืชื™ ื”ืชื—ื•ืฉื•ืช. ืขื ื”ืชื—ื•ืฉื” ื”ืจืืฉื•ื ื” ืื™ืŸ ื‘ืขื™ื” - ืืช ื”ืชื™ืขื•ื“ ืžื”ืืชืจ ืฉืœ ืืœื™ืงืกื™ืจ ืงืจืืชื™ ืชื•ืš ื›ื“ื™ ื ืกื™ืขื” ื‘ืื•ื˜ื•ื‘ื•ืก. ื™ื•ื ืื—ื“ ืคืฉื•ื˜ ื ืชืงืœืชื™ ื‘ืžืฉื”ื• ืขืœ ืืœื™ืงืกื™ืจ ืขื•ื“ ื›ืฉื—ื™ื›ื™ืชื™ ื‘ืชื—ื ื” ื•ื›ืฉื”ื’ื™ืข ื”ืื•ื˜ื•ื‘ื•ืก ื–ื” ื›ื‘ืจ ื”ื™ื” ืžืื•ื—ืจ ืžื“ื™ ืœื”ืคืกื™ืง. ืื ื™ ื—ื•ืฉื‘ ืฉื”ืขื‘ืจืชื™ ืืช ืจื•ื‘ ืื•ืชื• ื”ืœื™ืœื” ื‘ื›ืชื™ื‘ืช ื”ืชื•ื›ื ื™ื•ืช ื”ืจืืฉื•ื ื•ืช. ื”ืชื—ื•ืฉื” ื”ืฉื ื™ื” ื–ื” ืกื™ืคื•ืจ ืื—ืจ - ื›ืฉืื™ืŸ ืงืœื™ืง ืœื˜ื›ื ื•ืœื•ื’ื™ื” ืœื•ืงื— ื”ืจื‘ื” ื™ื•ืชืจ ื–ืžืŸ ื‘ื›ืœืœ ืœืžืฆื•ื ืืช ื”ื–ืžืŸ ื›ื“ื™ ืœืœืžื•ื“ ืื•ืชื”, ื•ื’ื ื”ืœื™ืžื•ื“ ื”ืจื‘ื” ืคื—ื•ืช ืืคืงื˜ื™ื‘ื™. ืงืฆื‘ ื”ื”ืชืงื“ืžื•ืช ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ื›ื–ืืช ื™ื›ื•ืœ ืœื”ื™ื•ืช ืื™ื˜ื™ ืคื™ 2 ืื• 3, ื•ืจืง ื‘ื’ืœืœ ืื™ื–ื” ืจื•ืฉื ืจืืฉื•ื ื™ ืื• State Of Mind ืœื ื ื›ื•ืŸ. ื•ื‘ืจื’ืข ืฉืจื•ืื™ื ืืช ื–ื” ื”ืคื™ืชืจื•ืŸ ืคืฉื•ื˜: ื‘ืžืงื•ื ืœื”ื›ืจื™ื— ืืช ืขืฆืžืš ืœืœืžื•ื“ ื˜ื›ื ื•ืœื•ื’ื™ื” ืฉืขื•ืฉื” ืœืš ืฆืจื‘ืช, ืขื“ื™ืฃ ืœืžืฆื•ื ืืช ื”ื“ืจืš ืœื”ืชืื”ื‘ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” (ื’ื ืื ื–ื” ืœื•ืงื— ื–ืžืŸ), ืœืงืจื•ื ืขืœื™ื” ื™ื•ืชืจ, ืœืฉืžื•ืข ื”ืจืฆืื•ืช ืžื›ื ืกื™ื, ืœื”ื‘ื™ืŸ ืžื” ืื ืฉื™ื ืื—ืจื™ื ืžื•ืฆืื™ื ื‘ื–ื” ืฉืื•ืœื™ ื’ื ืืช ืชืื”ื‘ื™; ืืคื™ืœื• ื”ืฉืงืขื” ืฉืœ ื›ืžื” ื—ื•ื“ืฉื™ื ืจืง ื‘ืฉื‘ื™ืจืช ื”ืžื—ืกื•ื ื”ืคืกื™ื›ื•ืœื•ื’ื™ ืชื—ื–ื™ืจ ืืช ืขืฆืžื” ืžื”ืจ ืžืื•ื“ ื‘ื–ืžืŸ ืœื™ืžื•ื“ ืงืฆืจ ื•ืืคืงื˜ื™ื‘ื™ ื‘ื”ืจื‘ื”.

ToCode
1 419
# ื—ืฉื‘ืชื™ ืฉืืฆืœื™ื— ืœื”ืกืชื“ืจ ื‘ืœื™ ื—ืฉื‘ืชื™ ืฉืืฆืœื™ื— ืœื”ืกืชื“ืจ ื‘ืœื™ ืœื“ืขืช ืขื“ ื”ืกื•ืฃ ืื™ืš z-index ืขื•ื‘ื“. ื›ืœ ืคืขื ืฉื ืชืงืขืชื™ ื‘ื‘ืขื™ื” ืื™ืชื• ื”ืชื™ืขื•ื“ ื”ื™ื” ื ืจืื” ืœื™ ื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื™ ืืจื•ืš ื•ื”ื™ื” ืœื™ ื™ื•ืชืจ ืงืœ ืœื—ืคืฉ ืคื™ืชืจื•ืŸ ืกืคืฆื™ืคื™ ื‘ Stack Overflow ืœื‘ืขื™ื” ืฉืœื™. ื—ืฉื‘ืชื™ ืฉืืฆืœื™ื— ืœื”ืกืชื“ืจ ื‘ืœื™ ืœื”ื‘ื™ืŸ ืขื“ ื”ืกื•ืฃ SQL. ืžืžื™ืœื ืืฆืœื ื• ื‘ืฆื•ื•ืช ืขื•ื‘ื“ื™ื ืขื ORM ื•ื”ืงื•ื“ ืฉืื ื™ ื›ื•ืชื‘ ืžืชื•ืจื’ื ืื•ื˜ื•ืžื˜ื™ืช ืœืฉืื™ืœืชื•ืช. ื—ืฉื‘ืชื™ ืฉืืฆืœื™ื— ืœื”ืกืชื“ืจ ื‘ืœื™ ืœื”ื‘ื™ืŸ ืขื“ ื”ืกื•ืฃ ืืช ืžืขืจื›ืช ื”ื”ืจืฉืื•ืช ืฉืœ AWS. ืชืžื™ื“ ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืขื•ื“ ื”ืจืฉืื•ืช ืขื“ ืฉื“ื‘ืจื™ื ืžืชื—ื™ืœื™ื ืœืขื‘ื•ื“. ืื– ื—ืฉื‘ืชื™. ืื‘ืœ ืœื”ืฆืœื™ื— ืœื”ืกืชื“ืจ ื–ื” ืœื ืœื”ืฆืœื™ื— ืœื›ืชื•ื‘ ืžืขืจื›ืช: ืืช ืงื•ื“ ื” CSS ื”ืžืกื•ืจื‘ืœ ืฉื›ืชื‘ืชื™ ืืฃ ืื—ื“ ื›ื‘ืจ ืœื ื™ืฆืœื™ื— ืœื”ืฆื™ืœ. ื‘ื’ืœืœ ื”ื‘ื™ืฆื•ืขื™ื ื”ื’ืจื•ืขื™ื ืฉืœ ื”ืฉืื™ืœืชื•ืช ืฉืœื™ ืฆืจื™ืš ืœืฉื›ืชื‘ ื›ืžืขื˜ ืืช ื›ืœ ื”ืฉืจืช ืžื—ื“ืฉ, ื•ืžืขืจื›ืช ื”ื”ืจืฉืื•ืช? ืื•ืœื™ ืื ื”ื™ื™ืชื™ ืžื‘ื™ืŸ ืื•ืชื” ืขื“ ื”ืกื•ืฃ ื”ืžืขืจื›ืช ืฉืœื™ ื”ื™ืชื” ื ืคืจืฆืช ืคื—ื•ืช ื‘ืงืœื•ืช. ื”ืžื˜ืจื” ืฉืœื ื• ื‘ื›ืชื™ื‘ืช ืงื•ื“ ื”ื™ื ืœื ืœื”ื›ื ื™ืก ื›ืžื” ืฉื™ื•ืชืจ ืคื™ืฆ'ืจื™ื ื›ืžื” ืฉื™ื•ืชืจ ืžื”ืจ; ื”ื™ื ืœื‘ื ื•ืช ืคื™ืฆ'ืจื™ื ื‘ืฆื•ืจื” ื—ื›ืžื” ื•ื˜ื•ื‘ื” ื›ื“ื™ ืฉื”ืžืขืจื›ืช ืชืฉืจื•ื“. ืื™ ืืคืฉืจ ืœืขืฉื•ืช ืืช ื–ื” ื›ืฉืžื“ืœื’ื™ื ืžืขืœ ื”ื‘ืกื™ืก.

ToCode
1 419
    const data = { type: 'PaymentReceived', payload: req.body };
    channel.publish('', 'payments-received', Buffer.from(JSON.stringify(data), 'utf8'));
    res.sendStatus(201);
  } catch (err) {
    console.log(err);
    res.sendStatus(500);
  }
});
ืœื ื—ื™ื™ื‘ื™ื ืœื‘ื“ื•ืง ืืช ืขืจืš ื”ื”ื—ื–ืจ ืฉืœ publish ื›ื™ ื’ื ืื ื”ื•ื false ื”ื”ื•ื“ืขื” ืขื“ื™ื™ืŸ ื ืฉืœื—ื” ืœืชื•ืจ. ื›ืŸ ืฆืจื™ืš ืœื˜ืคืœ ื‘ Exception ืฉืื•ืžืจ ืฉื”ืขืจื•ืฅ ืื• ื”ื—ื™ื‘ื•ืจ ื ืกื’ืจ. ## ืงื‘ืœืช ื”ื•ื“ืขื•ืช ื‘ืฆื“ ื”ืžืงื‘ืœ ืขื“ื™ื™ืŸ ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ืžื—ืœืงื” RabbitMQ ืฉืขื•ื˜ืคืช ืืช ื” connection ื•ืžืชื—ื‘ืจืช ืžื—ื“ืฉ, ืื‘ืœ ืขื ื˜ื•ื•ื™ืกื˜: ื”ืคืขื ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืคื•ื ืงืฆื™ื” consume ื›ืœ ืคืขื ืฉืžืชื—ื‘ืจื™ื ืžื—ื“ืฉ ืœ RabbitMQ ื›ื“ื™ ืœื”ืื–ื™ืŸ ืžื—ื“ืฉ ืœื”ื•ื“ืขื•ืช. ื‘ืฉื‘ื™ืœ ื–ื” ืื ื™ ืžื•ืกื™ืฃ ืœืžื—ืœืงื” ืฉื“ื” ืžื™ื“ืข ื ื•ืกืฃ ืฉื™ื—ื–ื™ืง ืžืขืจืš ืฉืœ ืชื•ืจื™ื ื•ืคื•ื ืงืฆื™ื•ืช ื˜ื™ืคื•ืœ ื‘ื”ื•ื“ืขื•ืช ื‘ื›ืœ ืชื•ืจ, ื•ืžืคืขื™ืœ ืืช consume ื›ืœ ืคืขื ืื—ืจื™ ืฉื”ืชื—ื‘ืจืชื™ ืžื—ื“ืฉ. ื”ืงื•ื“ ื ืจืื” ื›ืš:
class RabbitMQ {
  constructor(url) {
    this.url = url;
    this.messageHandlers = [];
  }

  async init() {
    while (true) {
      try {
        this.connection = await amqp.connect(this.url);
        this.connection.on('close', () => {
          console.log('Connection closed, reconnecting in 1 second');
          this.init();
        });
        break;
      } catch (err) {
        console.log('Connection failed, retrying in 1 second');
        console.log(err);
        await sleep(1000);
      }
    }
    const channel = await this.connection.createChannel();
    this.messageHandlers.forEach(({ queue, callback }) => {
      channel.consume(queue, callback.bind(null, channel));
    });

    return this.connection;
  }

  addMessageHandler(queue, callback) {
    this.messageHandlers.push({ queue, callback });
  }
}
ื‘ืฉื‘ื™ืœ ืœื”ืฉืชืžืฉ ื‘ื• ืื ื™ ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืื•ืชื• ืžืชื•ืš ืคื•ื ืงืฆื™ื” ื›ื–ืืช:
exports.start = async function start() {
  const rabbit = new RabbitMQ(RABBITMQ_URL);
  rabbit.addMessageHandler('payments-received', (channel, msg) => {
    console.log(`Received message: "${msg.content.toString()}"`);
    channel.ack(msg);
  });

  await rabbit.init();
}
ื•ื”ืชื•ืฆืื” ื”ื™ื ืงื•ื“ ืฉืจืช ืฉืžืื–ื™ืŸ ืœื”ื•ื“ืขื•ืช ื•ื›ืœ ืคืขื ืฉืžืงื‘ืœ ื”ื•ื“ืขื” ื“ืจืš RabbitMQ ื”ื•ื ื™ื“ืคื™ืก ืืช ื”ืชื•ื›ืŸ ืฉืœื” ืœืžืกืš, ื•ื™ื•ืชืจ ื—ืฉื•ื‘ - ืื RabbitMQ ื”ืชื ืชืง ืื• ืœื ื–ืžื™ืŸ ื–ืžื ื™ืช ืื– ื”ืฉืจืช ื™ืžืฉื™ืš ืœื ืกื•ืช ืœื”ืชื—ื‘ืจ ืžื—ื“ืฉ ืขื“ ืฉ Rabbit ื™ืขืœื” ืฉื•ื‘. ## ื .ื‘. ืœืžื” ืœื ืœื”ืคื™ืœ ืืช ื›ื•ืœื ื‘ื“ื•ืžื™ื ื•? ื’ื™ืฉื” ื—ืœื•ืคื™ืช ื ืคื•ืฆื” ื‘ืขื‘ื•ื“ื” ืขื ืงื•ื ื˜ื™ื™ื ืจื™ื ื”ื™ื "ืฉื™ื˜ืช ื”ื“ื•ืžื™ื ื•" (ืื ื™ ื—ื•ืฉื‘ ืฉื”ืจื’ืข ื”ืžืฆืืชื™ ืืช ื”ืฉื ื”ื–ื”, ืื– ืืœ ืชืฉืชืžืฉื• ื‘ื• ื‘ืฉื™ื—ื•ืช ืขื ืื ืฉื™ื ืžื‘ื—ื•ืฅ), ื”ืจืขื™ื•ืŸ ื‘ื’ื“ื•ืœ ื–ื” ืฉืื ื™ ืžืžื™ืœื ืจืฅ ื‘ืงื•ื ื˜ื™ื™ื ืจ ืฉืจืฅ ื‘ืชื•ืš ืื™ื–ื” ืžื ื”ืœ ืงื•ื ื˜ื™ื™ื ืจื™ื, ืื– ื›ืฉื™ืฉ ื‘ืขื™ื” ืื ื™ ื™ื›ื•ืœ ืœืฉื‘ื•ืจ ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ืฉืœื™ ื•ืžื ื”ืœ ื”ืงื•ื ื˜ื™ื™ื ืจื™ื ื›ื‘ืจ ื™ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจ ื—ื“ืฉ ืขื ื”ืงื•ื“. ื‘ื’ื™ืฉื” ื›ื–ืืช ืื ื™ ืžืฉืชืžืฉ ื‘ืกืงืจื™ืคื˜ ื›ืžื• wait-for-it ื‘ืขืœื™ื” ื‘ืฉื‘ื™ืœ ืœื•ื•ื“ื ืฉ Rabbit ื–ืžื™ืŸ ื•ื›ื›ื” ืื ื™ ื™ื•ื“ืข ืฉื”ืงื•ื ื˜ื™ื™ื ืจ ืฉืœื™ ื™ืขืœื” ืฉื•ื‘ ืจืง ื›ืฉ Rabbit ื’ื ืขื•ืœื” ืฉื•ื‘. ืื ื™ ืงื•ืจื ืœื” ืฉื™ื˜ืช ื”ื“ื•ืžื™ื ื• ื›ื™ ื”ื™ื ืื•ืžืจืช ืฉื›ืฉืกืจื‘ื™ืก ื ื•ืคืœ ืื– ื ืคื™ืœ ืื™ืชื• ืืช ื›ืœ ื”ืกืจื‘ื™ืกื™ื ืฉืงืฉื•ืจื™ื ืืœื™ื• ื•ืขื•ื“ ืžืขื˜ ืžื ื”ืœ ื”ืงื•ื ื˜ื™ื™ื ืจื™ื ืฉืœื ื• ื™ืจื™ื ืืช ื”ื›ืœ ืžื—ื“ืฉ ื•ื”ื›ืœ ื™ืกืชื“ืจ. ืื ื™ ืœื ืื•ื”ื‘ ืืช ื”ื’ื™ืฉื” ื”ื–ืืช ืžืฉืชื™ ืกื™ื‘ื•ืช: 1. ืžื‘ื—ื™ื ืช ืžืฉืื‘ื™ื ืœืกื’ื•ืจ ื•ืœืคืชื•ื— ืงื•ื ื˜ื™ื™ื ืจื™ื ื›ืœ ื”ื™ื•ื ื–ื” ื‘ื–ื‘ื–ื ื™, ื•ื‘ืžื™ื•ื—ื“ ื›ืฉืœื ื—ื™ื™ื‘ื™ื. 2. ืžื‘ื—ื™ื ืช ื”ืžืขืจื›ืช, ืื ืื ื™ ืกื•ื’ืจ ืืช ื›ืœ ื”ืงื•ื ื˜ื™ื™ื ืจ ืฉืœ ื”ืฉืจืช ืขื“ ืฉ Rabbit ื™ื”ื™ื” ื–ืžื™ืŸ, ืื•ืœื™ ืื ื™ ืžืคืกื™ื“ ื ืชื™ื‘ื™ื ืฉื”ื™ื™ืชื™ ื™ื›ื•ืœ ื›ืŸ ืœื˜ืคืœ ื‘ื”ื ืฉืœื ืฆืจื™ื›ื™ื ื›ืชื™ื‘ื” ืœ Rabbit, ืื‘ืœ ืขื›ืฉื™ื• ื™ื—ื–ื™ืจื• ืฉื’ื™ืื” ื›ื™ ื”ื•ืจื“ืชื™ ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ. ืžื—ืฉื‘ื” ืขืœ ื”ื‘ืขื™ื•ืช ืฉื™ืงืจื• ื•ื˜ื™ืคื•ืœ ื‘ื”ืŸ ื‘ืงื•ื“ ืขื•ื–ืจื™ื ืœื ื• ืœื›ืชื•ื‘ ืกืจื‘ื™ืกื™ื ืฉื™ื”ื™ื• ื—ืกื™ื ื™ื ื™ื•ืชืจ ืœื‘ืขื™ื•ืช ื•ื›ืš ื™ืชืจืžื• ืœื™ืฆื™ื‘ื•ืช ื”ื›ืœืœื™ืช ืฉืœ ื”ืžืขืจื›ืช.

ToCode
1 419
# ืื™ืš ืฉื•ืœื—ื™ื ื•ืžืงื‘ืœื™ื ื”ื•ื“ืขื•ืช ื‘ืชื•ืจ RabbitMQ ืžืชื•ืš ืฉืจืช Node.JS Express ื›ืฉืื ื™ ื›ื•ืชื‘ ืงื•ื“ ืžื“ื™ ืคืขื ืื ื™ ื ืชืงืข ืขืœ ืฉื˜ื•ืช ืฉืื ื™ ื—ื•ืฉื‘ ืฉืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžืื•ื“ ื‘ืจื•ืจื”. ื”ืฉื˜ื•ืช ืฉืœ ื”ื™ื•ื ื”ื™ืชื” RabbitMQ ื•ื‘ืคืจื˜ ืื™ืš ืœื—ื‘ืจ ืื•ืชื• ืœ Express. ื”ื ื” ื”ืงื•ื“ ืฉื‘ืกื•ืฃ ืขื‘ื“ ืœื™ ื‘ืฆื™ืจื•ืฃ ื›ืžื” ืื™ืœื•ืฆื™ื ืฉืฉื•ื•ื” ืœืฉื™ื ืœื‘ ืืœื™ื”ื ื›ืฉืืชื ืžืงื•ื“ื“ื™ื ื“ื‘ืจื™ื ื“ื•ืžื™ื. ## ืขืœ ืžื” ื—ืฉื•ื‘ ืœื”ืกืชื›ืœ ืžืฆืืชื™ ื”ืžื•ืŸ ืžื“ืจื™ื›ื™ื ื‘ืจืฉืช ืฉืžืจืื™ื ืื™ืš ืœื”ืชื—ื‘ืจ ืžืฉืจืช Express ืœ RabbitMQ ืื‘ืœ ืืฃ ืื—ื“ ืžื”ื ืœื ื”ืชืื™ื ื‘ื“ื™ื•ืง, ื•ืœื›ืŸ ืœืงื— ืœื™ ื™ื—ืกื™ืช ื”ืจื‘ื” ื–ืžืŸ ืœื‘ื ื•ืช ืืช ื”ืื™ื ื˜ื’ืจืฆื™ื”. ืืœื” ื”ื ืงื•ื“ื•ืช ื”ืžืจื›ื–ื™ื•ืช ืฉื—ื™ืคืฉืชื™ ื‘ืคื™ืชืจื•ืŸ: 1. ืคืชื™ื—ืช Connection ืœ RabbitMQ ื”ื™ื ื™ืงืจื”. ืื ื—ื ื• ืจื•ืฆื™ื ืœืขืฉื•ืช ืืช ื–ื” ื’ื’ ืคืขื ืื—ืช ื‘ื™ื™ืฉื•ื. 2. ืคืชื™ื—ืช Channel ื”ื™ื ืœื ื™ื•ืชืจ ืžื“ื™ ื™ืงืจื”, ื• RabbitMQ ืžืžืฉ ืื•ื”ื‘ ืœืกื’ื•ืจ ืœื ื• Channel-ื™ื ื‘ืืžืฆืข ื”ื—ื™ื™ื, ืœืคืขืžื™ื ืกืชื ื‘ืฉื‘ื™ืœ ืœื”ืจื’ื™ื–. ื” Channel ืžื™ื™ืฆื’ ืจืฆืฃ ืชืงืฉื•ืจืช ืžืกื•ื™ื ื•ื”ื’ื™ืฉื” ืฉืœ RabbitMQ ื”ื™ื ืฉื›ืœ ื”ื•ื“ืขื” ืœื ื‘ืžืงื•ื ื•ื”ื•ื ืกื•ื’ืจ ืืช ื” Channel. ืœื›ืŸ ื—ืฉื•ื‘ ืžืื•ื“ ืœื ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• Channel ื‘ื›ืžื” Thread-ื™ื, ืื• ื‘ืžืงืจื” ืฉืœ Express ืœื ืžืฉืชืคื™ื Connection ื‘ื™ืŸ ื›ืžื” ื‘ืงืฉื•ืช. 3. ื’ื ืื publish ืžื—ื–ื™ืจ false ื”ื•ื ืขื“ื™ื™ืŸ ืฉืœื— ืืช ื”ื”ื•ื“ืขื”. ืื‘ืœ ืื publish ื–ืจืง Exception ื›ืŸ ื›ื“ืื™ ืœื“ื•ื•ื— ืขืœ ื–ื” ื”ืœืื” ื›ื™ ื–ื” ืื•ืžืจ ืฉื” Connection ืกื’ื•ืจ. 4. ื•ื”ื›ื™ ื—ืฉื•ื‘ ื”ื•ื ืฉื’ื RabbitMQ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืœืžื˜ื” ืžื›ืœ ืžื™ื ื™ ืกื™ื‘ื•ืช. ื›ืฉื–ื” ืงื•ืจื” ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ื—ื–ื™ืจ ืฉื’ื™ืื” ืœืžืฉืชืžืฉื™ื ืฉืžื ืกื™ื ืœื‘ืฆืข ืคืขื•ืœื” ื‘ื ืชื™ื‘ ืฉืžืฉื“ืจ ืœืชื•ืจ, ืื‘ืœ ืขื“ื™ื™ืŸ ืœื”ืฉืื™ืจ ืืช ื”ืฉืจืช ื–ืžื™ืŸ ืœื˜ื™ืคื•ืœ ื‘ื ืชื™ื‘ื™ื ืื—ืจื™ื ื•ื›ืœ ื”ื–ืžืŸ ืœื ืกื•ืช ืœื”ืชื—ื‘ืจ ืžื—ื“ืฉ ื›ื“ื™ ืฉื ื•ื›ืœ ืœื—ื–ื•ืจ ืœืขื‘ื•ื“ ื›ืฉ Rabbit ื™ืขืœื” ื—ื–ืจื”. ืขื ืืจื‘ืขืช ื”ื ืงื•ื“ื•ืช ืžื•ืœ ื”ืขื™ื ื™ื™ื ืืคืฉืจ ืœื”ืžืฉื™ืš ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“. ## ืงื•ื“ ืฉืžื˜ืคืœ ื‘ื—ื™ื‘ื•ืจ ืœ Rabbit ืกืคืจื™ื™ืช amqplib ืฉืœ Node.JS ืœื ืžื˜ืคืœืช ื‘ื—ื™ื‘ื•ืจ ืžื—ื“ืฉ ืื—ืจื™ ื ื™ืชื•ืง ืื– ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืกื’ื•ืจ ื‘ืฉื‘ื™ืœื ืืช ื”ืคื™ื ื”. ืืคืฉืจ ืœื‘ื ื•ืช ืžื—ืœืงื” ืฉืขื•ื˜ืคืช Connection ืฉืชื“ืื’ ืœื–ื” ื‘ืฆื•ืจื”, ื›ืš ืฉื” Connection ื™ื™ืฉืžืจ ื‘ืชื•ืจ ืฉื“ื” ืžื™ื“ืข ื‘ืžื—ืœืงื” ื•ื›ืœ ืคืขื ืฉื”ื•ื ื™ื™ืกื’ืจ ืื•ื˜ื•ืžื˜ื™ืช ื ื ืกื” ืœื”ืชื—ื‘ืจ ืžื—ื“ืฉ. ื”ื ื” ื”ืงื•ื“:
class RabbitMQ {
  constructor(url) {
    this.url = url;
  }

  async init() {
    while (true) {
      try {
        this.connection = await amqp.connect(this.url);
        this.connection.on('close', () => {
          console.log('Connection closed, reconnecting in 1 second');
          this.init();
        });
        break;
      } catch (err) {
        console.log('Connection failed, retrying in 1 second');
        await sleep(1000);
      }
    }

    return this.connection;
  }
}

function sleep(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
}
ื‘ืžืฆื‘ ืฉืฉืจืช RabbitMQ ื–ืžื ื™ืช ืœื ื–ืžื™ืŸ ืื•ื‘ื™ืงื˜ ื” connection ื™ื™ืกื’ืจ ื•ืื– ื›ืœ ื”ืคืขื•ืœื•ืช ืฉื ื ืกื” ืœืขืฉื•ืช ืขืœื™ื• ื™ื™ื›ืฉืœื•. ืื‘ืœ, ื‘ื–ื›ื•ืช ื” Event Handler ืฉื”ืชืงื ืชื™ ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ื ื ืกื” ืœื”ืชื—ื‘ืจ ืžื—ื“ืฉ ื•ืื—ืจื™ ืฉื™ื”ื™ื” ืฉื•ื‘ ื—ื™ื‘ื•ืจ ื ืžืฉื™ืš ืœืขื‘ื•ื“ ืขื ื” Connection ื”ื—ื“ืฉ. ## ืงื•ื“ ืฉืจืช ืฉืฉื•ืœื— ื”ื•ื“ืขื•ืช ืื– ืื™ืš ืขื•ื‘ื“ื™ื ืขื ื”ืžื—ืœืงื” RabbitMQ ืืชื ืฉื•ืืœื™ื? ื”ืžืฉื—ืง ื”ื•ื ืคืฉื•ื˜ - ื‘ืขืœื™ื” ืฉืœ ื”ืฉืจืช ืื ื™ ืจื•ืฆื” ืœื”ืคืขื™ืœ ืืช init ื•ืœื—ื›ื•ืช ืฉื™ืฆืœื™ื—, ื•ืื—ืจื™ ื–ื” ื‘ื›ืœ ื‘ืงืฉื” ื ื›ื ืกืช ืื ืกื” ืœืคืชื•ื— Channel ืขื‘ื•ืจ ืื•ืชื” ื‘ืงืฉื”. ืื ื”ื ื™ืกื™ื•ืŸ ืžืฆืœื™ื— ืืคืฉืจ ื™ื”ื™ื” ืœื”ืžืฉื™ืš ืœื˜ืคืœ ื‘ื‘ืงืฉื” ื•ืื ื”ื•ื ื ื›ืฉืœ (ืœืžืฉืœ ื›ื™ Rabbit ื–ืžื ื™ืช ืœื ื–ืžื™ืŸ) ืื– ื ื—ื–ื™ืจ ืฉื’ื™ืื”. ืืช ื”ืคืขื•ืœื” ื”ื–ืืช ืื ื™ ืขื•ืฉื” ื‘ Middleware ืฉื™ื•ืคืขืœ ืขื‘ื•ืจ ื›ืœ ื”ื‘ืงืฉื•ืช ืฉืฆืจื™ื›ื•ืช ืืช RabbitMQ. ื” Middleware ื•ืื™ืชื—ื•ืœ ื”ืฉืจืช ื ืจืื™ื ื›ืš:

const rabbit = new RabbitMQ(RABBITMQ_URL);

async function setup(app) {
  await rabbit.init();
  app.use(logger('dev'));
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  console.log('setup');

  app.use(async function(req, _res, next) {
    try {
      // Fetches the active connection or re-connect
      const connection = rabbit.connection;
      const channel = await connection.createChannel();
      req.locals = req.locals || {};
      req.locals.channel = channel;
      return next();
    } catch (err) {
      console.log(err);
      return next(err);
    }
  });

  app.use('/', indexRouter);
}

setup(app);
ืฆืจื™ืš ืœื”ื’ื™ื“ - ื‘ื“ื•ื’ืžืช ื”ืงื•ื“ ื›ืืŸ ื” Middleware ืคื•ืขืœ ืขืœ ื›ืœ ื”ื ืชื™ื‘ื™ื, ืื‘ืœ ื‘ื’ืœืœ ืฉื–ื” Middleware ืžืื•ื“ ืงืœ ืœื”ื•ืกื™ืฃ ื”ื’ื‘ืœื” ืฉื™ืคืขืœ ืจืง ืขืœ ื ืชื™ื‘ื™ื ืžืกื•ื™ืžื™ื ืื• ืขืœ Router ืžืกื•ื™ื. ื‘ืชื•ืš ืงื•ื“ ื”ื˜ื™ืคื•ืœ ื‘ื ืชื™ื‘ ืื ื™ ื™ื›ื•ืœ ืœืžืฉื•ืš ืืช ื” Channel ื•ืœืคืจืกื ืืœื™ื• ื”ื•ื“ืขื•ืช ื‘ืื•ืคืŸ ื”ื‘ื:
router.all('/ipn', function(req, res) {
  try {
    const { channel } = req.locals;

ToCode
1 419
# ืฉืœื•ืฉื” ื“ื‘ืจื™ื ืฉืื”ื‘ืชื™ ื‘ืงื•ื‘ืจื ื˜ืก (ื•ืื—ื“ ืฉืžืžืฉ ืœื) ื‘ืชื™ืื•ืจื™ื”, ืชืจื’ื•ื ืคืจื•ื™ืงื˜ ืž Docker Compose ืœ Kubernetes ื”ื•ื ื”ื“ื‘ืจ ื”ื›ื™ ืงืœ ื‘ืขื•ืœื: ืžืคืขื™ืœื™ื ืกืงืจื™ืคื˜ ืื—ื“ ืฉืžืชืจื’ื ืืช ืงื‘ืฆื™ ื” docker-compose.yml ืœืงื‘ืฆื™ ื”ื”ื’ื“ืจื•ืช ืฉืœ k8s, ืžืขืœื™ื ืืช ื”ืชื•ืฆืื” ืœืงืœืืกื˜ืจ ืงื™ื™ื ื•ื ื”ื ื™ื ืžื”ื—ื™ื™ื. ื”ืžืฆื™ืื•ืช ืœืงื—ื” ืœื™ ืงืฆืช ื™ื•ืชืจ ืขื‘ื•ื“ื” ื•ื“ืจืฉื” ืžืกืคืจ ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ื”ืžืขืจื›ืช - ืื‘ืœ ื‘ืฆื“ ื”ื—ื™ื•ื‘ื™ ืกื™ื™ืžืชื™ ืขื ืงื•ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืžื–ื” ืฉื”ื™ื” ื‘ื”ืชื—ืœื” ื•ื’ื ื”ื‘ื ื” ื˜ื•ื‘ื” ื™ื•ืชืจ ืฉืœ ื”ืืจื›ื™ื˜ืงื˜ื•ืจื”. ืžื”ืชื”ืœื™ืš ื’ื ืœืžื“ืชื™ ืœื—ื‘ื‘ ืžืกืคืจ ื“ื‘ืจื™ื ื‘ืงื•ื‘ืจื ื˜ืก, ื•ื”ื ื” ื”ืฉืœื•ืฉื” ื”ืžืจื›ื–ื™ื™ื: ## ื” Dashboard ืœ Kubernetes ื™ืฉ ืœื•ื— ื‘ืงืจื” ืžื•ื‘ื ื” ืฉืžืืคืฉืจ ื‘ืžื›ื” ืื—ืช ืœืจืื•ืช ืืช ื›ืœ ื”ืžื›ื•ื ื•ืช, ืืช ื›ืœ ื”ืชื•ื›ื ื™ื•ืช ืฉืจืฆื•ืช ืขืœ ื›ืœ ืžื›ื•ื ื” ื•ื’ื ืืช ื”ืœื•ื’ื™ื, ื—ื™ื‘ื•ืจื™ ื”ืจืฉืช ื•ืืคื™ืœื• ืžืกืคืง ืืคืฉืจื•ืช ืœื”ืชื—ื‘ืจ ื•ืœืงื‘ืœ Shell ืขืœ ื›ืœ ืžื›ื•ื ื”. ืœืžืจื•ืช ืฉืื ื™ ืžืื•ื“ ืื•ื”ื‘ ืืช ื”ืขื‘ื•ื“ื” ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ื’ื™ืœื™ืชื™ ืฉืœื•ื— ื‘ืงืจื” ืฉื‘ื ื•ื™ ื˜ื•ื‘ ื™ื›ื•ืœ ืœื”ืจืื•ืช ื‘ืขื™ื•ืช ืฉื‘ืฉื•ืจืช ื”ืคืงื•ื“ื” ื™ื”ื™ื” ืงืฉื” ืœืžืฆื•ื, ื•ืฉื™ืฉ ืžืฉื”ื• ืžืขื•ื“ื“ ื‘ืชืžื•ื ื” ืฉืœ ื”ืขื™ื’ื•ืœื™ื ื”ื™ืจื•ืงื™ื. ืœื•ื— ื”ื‘ืงืจื” ืฉืœ k8s ืžืชืขื“ื›ืŸ ื‘ื–ืžืŸ ืืžืช ืขืœ ื›ืœ ืฉื™ื ื•ื™ ื‘ืงืœืืกื˜ืจ, ื•ื™ืฉ ืžืฉื”ื• ืงืกื•ื ื‘ืœื”ื—ื–ื™ืง Terminal ืขืœ ื—ืฆื™ ืžืกืš ื•ื—ืœื•ืŸ ื“ืคื“ืคืŸ ืฉืžืจืื” ืืช ืœื•ื— ื”ื‘ืงืจื” ืขืœ ื”ื—ืฆื™ ื”ืฉื ื™ ื•ืœืจืื•ืช ืื™ืš ืคืงื•ื“ื•ืช kubectl ืฉืื ื™ ืžืคืขื™ืœ ื‘ืžืกื•ืฃ ืžืขื“ื›ื ื•ืช ื‘ื–ืžืŸ ืืžืช ืืช ื”ืชืฆื•ื’ื” ื‘ื“ืคื“ืคืŸ. ## ื”ืชื™ืขื•ื“ ืื™ืŸ ื›ืœ ื›ืš Tutorials ื˜ื•ื‘ื™ื ืขืœ ืงื•ื‘ืจื ื˜ืก ืื‘ืœ ื”ืชื™ืขื•ื“ ืขืฆืžื• ืžืขื•ืœื” ื•ื›ืœ ืขื•ื“ ืืชื ืžื•ื›ื ื™ื ืœื”ืฉืงื™ืข ืืช ื”ื–ืžืŸ ื‘ืงืจื™ืื” ืฉืœื• (ื–ื” ืืจื•ืš ื›ื™ k8s ืขืฆืžื• ืกื•ืคืจ ืžื•ืจื›ื‘), ืื– ื‘ืกื•ืฃ ืชืžืฆืื• ืืช ื›ืœ ืžื” ืฉืืชื ืฆืจื™ื›ื™ื ื•ื”ืจื‘ื” ื™ื•ืชืจ. ืื ืืชื ืžืชื—ื™ืœื™ื ืœืขื‘ื•ื“ ืขื ืงื•ื‘ืจื ื˜ืก ืชืขืฉื• ืœืขืฆืžื›ื ื˜ื•ื‘ื” ื•ืงื—ื• ื›ืžื” ื™ืžื™ื ืจืง ืœืงืจื•ื ืืช ื”ืชื™ืขื•ื“ ืžืงืฆื” ืœืงืฆื” ื•ื‘ืžื™ื•ื—ื“ ืœื”ื‘ื™ืŸ ืืช ื”ืžื•ืฉื’ื™ื. ื–ื” ื™ื—ืกื•ืš ืœื›ื ืฉืขื•ืช ืฉืœ ื—ื™ืคื•ืฉ ืคื™ืชืจื•ื ื•ืช ื‘ืื™ื ื˜ืจื ื˜ ืœืฉืืœื•ืช ืœื ื”ื’ื™ื•ื ื™ื•ืช. ืฉื•ื•ื” ืœื”ืชื—ื™ืœ ื›ืืŸ: https://kubernetes.io/docs/concepts/. ## ืขื“ื›ื•ื ื™ื ื—ื™ื™ื ื•ื”ื•ื“ืขื•ืช ืฉื’ื™ืื” ืื—ืจื™ ื™ื•ืชืจ ืžื“ื™ ืฉืขื•ืช ืขื docker compose ืื ื™ ื›ื‘ืจ ื“ื™ ืžื›ื™ืจ ืืช ื›ืœ ื”ืฉื˜ื•ื™ื•ืช ืฉืœื•: ืื ื™ ื™ื•ื“ืข ืžืชื™ ื”ื•ื ืจืง ืขื•ืฉื” ื›ืื™ืœื• ื”ื•ื ื‘ื•ื ื” ืื™ืžื’' ืื‘ืœ ื‘ืขืฆื ืœื•ืงื— ืžื™ื“ืข ื™ืฉืŸ ื•ืœื ืจืœื•ื•ื ื˜ื™ ืžื” Cache ื•ืœืžื” ื”ื•ื ืžืชื›ื•ื•ืŸ ื›ืฉื”ื•ื ื›ื•ืชื‘ ืœื™ ื”ื•ื“ืขื•ืช ืฉื’ื™ืื” ืงืจื™ืคื˜ื™ื•ืช. ืžืจืขื ืŸ ื•ื ื—ืžื“ ื”ื™ื” ืœืจืื•ืช ืืช ืงื•ื‘ืจื ื˜ืก ืฉืœื•ืงื— ื’ื™ืฉื” ื”ืคื•ื›ื” - ืฉื ืื ืœื ื›ืชื‘ืชื™ ืžืฉื”ื• ื˜ื•ื‘ ื”ื•ื ื™ืฆืขืง, ื•ืœืคื—ื•ืช ืžื”ืžืฉื—ืงื™ื ืขื“ ืขื›ืฉื™ื• ื”ื™ื” ืœื™ ืชืžื™ื“ ืžืื•ื“ ื‘ืจื•ืจ ืžื” ืื•ืžืจืช ื”ืฉื’ื™ืื” ื•ืื™ืš ืœืชืงืŸ. ื•ืžื” ืฉื‘ืืžืช ืžืœื”ื™ื‘ ื”ื•ื ื”ืขื“ื›ื•ืŸ ื”ื—ื™ ื•ื–ื™ื”ื•ื™ ื”ืฉื™ื ื•ื™ื™ื ื›ืš ืฉืื ื™ ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื”ืคืขื™ืœ kubectl apply -f . ืื—ืจื™ ืฉืื ื™ ืžืขื“ื›ืŸ ืงื•ื ืคื™ื’ื•ืจืฆื™ื•ืช ื•ื”ืงืœืืกื˜ืจ ืคืฉื•ื˜ ื™ื“ืข ืžื” ืœืขืฉื•ืช. ## ื•ืื—ื“ ืฉืžืžืฉ ืœื ืื– ืžื” ื™ืฉ ืœื ืœืื”ื•ื‘? ื”ืื‘ืกื˜ืจืงืฆื™ื•ืช ื”ืžื•ื’ื–ืžื•ืช ื›ืžื•ื‘ืŸ. ื›ืžื” ืขืฉืจื•ืช ืฉื•ืจื•ืช ืฉืœ ืงื•ื‘ืฅ docker-compose.yml ื”ืคื›ื• ื‘ืœื™ ืœืฉื™ื ืœื‘ ืœื›ืžืขื˜ ืืœืฃ ืฉื•ืจื•ืช ืฉืœ ืงื‘ืฆื™ ื”ื’ื“ืจื•ืช ืฉืœ ืงื•ื‘ืจื ื˜ืก. ื—ืœืง ืžื–ื” ืงื•ืจื” ื›ื™ ืงื•ื‘ืจื ื˜ืก ื ื•ืชืŸ ืœื™ ื™ื•ืชืจ ืฉืœื™ื˜ื” ืขืœ ื”ืงืœืืกื˜ืจ ื•ื”ืžื›ื•ื ื•ืช, ืื‘ืœ ื”ืจื‘ื” ื–ื” ืคืฉื•ื˜ ื‘ื ื™ื” ืžื•ื–ืจื” ืฉืœ ืงื‘ืฆื™ ื”ื”ื’ื“ืจื•ืช ื•ื”ืชืขืงืฉื•ืช ืขืœ ืฉื˜ื•ื™ื•ืช. ื”ื ื” ื“ื•ื’ืžื” ืงื˜ื ื” ืžืื—ืช ื”ื”ื’ื“ืจื•ืช:
backend:
  service:
    name: test
    port:
      number: 80
ืื ื™ ื‘ื˜ื•ื— ืฉื”ื™ืชื” ืœื”ื ืกื™ื‘ื” ื˜ื•ื‘ื” ืœื”ื•ืกื™ืฃ ืืช ื”ืžืคืชื— number ื‘ืชื•ืš port, ืื‘ืœ ืžื•ื›ืŸ ืœื”ืžืจ ืฉืืคื™ืœื• ื”ื ื›ื‘ืจ ืฉื›ื—ื• ืื•ืชื”. (ืื• ื‘ื’ื™ื–ืจืช ื”ืื‘ืกื˜ืจืงืฆื™ื•ืช - ื”ืงื•ื ืกืคื˜ ืฉืœ Ingress Controller ืฉืื•ืžืจ ืฉืื ื™ ืฆืจื™ืš ืœื›ืชื•ื‘ ื”ื’ื“ืจื•ืช NGINX ื‘ DSL ืฉืœื”ื ืฉื”ื•ืคืš ืœืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืฉืœ nginx, ืจืง ื‘ืฉื‘ื™ืœ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืขืชื™ื“ ื‘ื›ืœื™ ืื—ืจ ื‘ืžืงื•ื nginx ื”ื•ื ืœื ื”ื’ื™ื•ื ื™, ื›ื™ ื‘ืกื•ืฃ ื’ื ื‘ืชื•ืš ื” DSL ื”ื”ื’ื“ืจื•ืช ื”ืŸ ืžืื•ื“ ืกืคืฆื™ืคื™ื•ืช ืœ nginx). ืื ืืชื ืจื•ืฆื™ื ืœืœืžื•ื“ ืงืฆืช ืขืœ ืงื•ื‘ืจื ื˜ืก ื•ืœื ื‘ื˜ื•ื—ื™ื ืื™ืคื” ืœื”ืชื—ื™ืœ ืื ื™ ืžืžืœื™ืฅ ืœื”ืชืงื™ืŸ minikube ืืฆืœื›ื ืขืœ ื”ืžื›ื•ื ื” ืœืคื™ ื”ืžื“ืจื™ืš ื›ืืŸ: https://kubernetes.io/docs/tutorials/hello-minikube/ ื•ืื—ืจื™ ื–ื” ืœื”ืฉืชืžืฉ ื‘ kompose ื›ื“ื™ ืœื”ืคื•ืš ืคืจื•ื™ืงื˜ Docker Compose ืœืคืจื•ื™ืงื˜ k8s ื•ืœื ืกื•ืช ืœื”ืขืœื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ืขืœ ื”ืงืœืืกื˜ืจ ืฉื™ืฆืจืชื. ื‘ื“ืจืš ืฉื•ื•ื” ืœื”ืฉืงื™ืข ื›ืžื” ื™ืžื™ื ื‘ืงืจื™ืืช ื”ืชื™ืขื•ื“.

ToCode
1 419
# ื˜ื™ืคื™ื ืœืฉื™ื—ื•ืช ืžื›ื™ืจื” ื˜ื•ื‘ื•ืช ื™ื•ืชืจ ืฉื™ื—ืช ืžื›ื™ืจื” ื”ื™ื ื”ืฉื™ื—ื” ื”ืื—ืจื•ื ื” ื”ืžืกื•ื›ื ืช ืœืคื ื™ ืฉืœืงื•ื— ืกื•ื’ืจ ืืชืš ืขื™ืกืงื”. ื”ื™ื ื”ืจื’ืข ืฉื‘ื• ื”ืœืงื•ื— ืžื—ืœื™ื˜ "ืœื•ืงื—" ืื• "ืœื ืœื•ืงื—", ื•ืฉื™ื—ื•ืช ืžื›ื™ืจื” ื”ืŸ ืžื”ื“ื‘ืจื™ื ืฉืคืจื™ืœืื ืกืจื™ื ื”ื›ื™ ื ืœื—ืฆื™ื ืžื”ื. ืื‘ืœ ืฉื™ื—ื•ืช ืžื›ื™ืจื” ืœื ืฆืจื™ื›ื•ืช ืœื”ื™ื•ืช ืžืœื—ื™ืฆื•ืช, ืœืคื—ื•ืช ืœื ืื ืžืชื™ื—ืกื™ื ืืœื™ื”ืŸ ื‘ืฆื•ืจื” ื ื›ื•ื ื” ื•ืžื‘ื™ื ื™ื ืืช ื”ืจืฆืฃ ืฉืœื”ืŸ ื‘ืชื•ืš ืชื”ืœื™ืš ื”ืžื›ื™ืจื”. ืฉื™ื—ื•ืช ื”ืžื›ื™ืจื” ื”ื˜ื•ื‘ื•ืช ืฉื”ืฉืชืชืคืชื™ ื‘ื”ืŸ ื”ื™ื• ื ืขื™ืžื•ืช ืœืฉื ื™ ื”ืฆื“ื“ื™ื - ื•ืœืžืขืฉื” ื‘ืžื™ื•ื—ื“ ืœืœืงื•ื—, ืฉืงื™ื‘ืœ ืžื™ื“ืข ืžื•ืขื™ืœ ื•ืฉืžื— ืœื”ืชืงื“ื (ื›ื•ืœืœ ื‘ืžืงืจื™ื ืฉืื ื™ ื”ื™ื™ืชื™ ื”ืœืงื•ื—). ื”ื ื” ื›ืžื” ื˜ื™ืคื™ื ืฉื™ืขื–ืจื• ืœื ื• ืœืžื›ื•ืจ ื•ืœืงื ื•ืช ื˜ื•ื‘ ื™ื•ืชืจ: 1. ืฉื™ื—ืช ืžื›ื™ืจื” ืžืชื—ื™ืœื” ื›ืฉืœืงื•ื— ืžื’ื™ืข ืืœื™ื›ื ืขื ื‘ืขื™ื” ื•ืžื—ืคืฉ ืืœื™ื” ืคื™ืชืจื•ืŸ. ื–ื” ืœื ืคื™ืจืกื•ืžืช ื‘ืคื™ื™ืกื‘ื•ืง ืฉืœืงื•ื— ื‘ืžืงืจื” ืœื—ืฅ ื•-ื”ื•ืค ืืชื ื‘ืฉื™ื—ื”, ื–ื• ืกื™ื˜ื•ืืฆื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืžืžื•ืงื“ืช. ืœื›ืŸ ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ื–ื” ืœื”ื‘ื™ืŸ ืžื” ื”ื‘ืขื™ื” ืฉืœ ื”ืœืงื•ื—. 2. ืื ื”ื‘ื ืชื™ ืืช ื”ื‘ืขื™ื” ืื ื™ ื™ื›ื•ืœ ืœื”ื—ืœื™ื˜ ื”ืื ืื ื™ ืจื•ืฆื”/ื™ื›ื•ืœ ืœืคืชื•ืจ ืื•ืชื”. ืื ืœืงื•ื— ื”ื’ื™ืข ืืœื™ื™ ื›ื“ื™ ืฉืื ื™ ืืคืชื•ืจ ืœื• ื‘ืขื™ื™ืช ื‘ื™ืฆื•ืขื™ื ื‘ React ื–ื” ื‘ืกื“ืจ ืœื”ื—ืœื™ื˜ ืฉืื ื™ ืจื•ืฆื” ืœืคืชื•ืจ ืœื• ืืช ื”ื‘ืขื™ื” ืื• ืœื ืจื•ืฆื”. ืื ืื ื™ ืœื ืจื•ืฆื” ืื• ืœื ื™ื›ื•ืœ ืœืคืชื•ืจ ืœื• ืืช ื”ื‘ืขื™ื” ืจืฆื•ื™ ืœืกื™ื™ื ื‘ื ื™ืžื•ืก ืืช ื”ืฉื™ื—ื”. ืฉื•ื ื“ื‘ืจ ืžืœื‘ื“ ืคื™ืชืจื•ืŸ ื”ื‘ืขื™ื” ืฉืœ ื”ืœืงื•ื— ืœื ืžืขื ื™ื™ืŸ ื›ืจื’ืข. 3. ืื ื”ื‘ื ืชื™ ืืช ื”ื‘ืขื™ื” ื•ืื ื™ ืจื•ืฆื” ืœืคืชื•ืจ ืื•ืชื” ืื ื™ ื™ื›ื•ืœ ืœื”ืชืงื“ื ื•ืœื“ื‘ืจ ืขืœ ื”ืคื™ืชืจื•ืŸ, ื•ืคื” ื”ืจื’ืข ืฉืื ื—ื ื• ืžืชื—ื™ืœื™ื ืœื™ื”ื ื•ืช ืžื”ืฉื™ื—ื”. ืื ืœืงื•ื— ื”ื’ื™ืข ืืœื™ื™ ืขื ื‘ืขื™ื™ืช ื‘ื™ืฆื•ืขื™ื ื‘ืจื™ืืงื˜ ื•ืื ื™ ืจื•ืฆื” ืœืขื–ื•ืจ ืœื• ื‘ืคื™ืชืจื•ืŸ ืื ื™ ืื‘ื“ื•ืง ืื™ืชื• ืžื” ื”ื•ื ื ื™ืกื” ื‘ื™ื ืชื™ื™ื, ื‘ืื™ื–ื” ืขื•ื“ ืกืคืจื™ื•ืช ื”ื•ื ืžืฉืชืžืฉ, ืืชืŸ ืœื• ื˜ื™ืคื™ื ืžื” ืื ื™ ื”ื™ื™ืชื™ ืขื•ืฉื” ื‘ืžืฆื‘ ื”ื–ื” ื•ืžืชืืจ ืœืœืงื•ื— ืžืคืช ื“ืจื›ื™ื ืžื“ื•ื™ืงืช ืฉืœ ืื™ืš ื”ื‘ืขื™ื” ืฉืœื• ื”ื•ืœื›ืช ืœื”ื™ืคืชืจ. ื›ืžื” ืฉืชืชื ื• ืคื” ื™ื•ืชืจ ืžื™ื“ืข ื•ืชืขื ื• ืขืœ ื™ื•ืชืจ ืฉืืœื•ืช ื›ื›ื” ืฉื ื™ ื”ืฆื“ื“ื™ื ื™ืจื•ื•ื™ื—ื•: ืืชื ืžื’ื“ื™ืœื™ื ืืช ื”ืกื™ื›ื•ื™ื™ื ืฉื”ืœืงื•ื— ื™ืงื ื” ืžื›ื ื‘ืกื•ืฃ, ื•ื”ืœืงื•ื— ืžืจื•ื•ื™ื— ืžื™ื“ืข ื™ืงืจ ืขืจืš ื”ืžื‘ื•ืกืก ืขืœ ื”ื ื™ืกื™ื•ืŸ ื•ื”ื™ื“ืข ื”ื™ื™ื—ื•ื“ื™ื™ื ืฉืœื›ื. 4. ืœืคืขืžื™ื ืื—ืจื™ ืฉื”ืขื‘ืจืชื™ ืœืœืงื•ื— ืืช ื›ืœ ืžืคืช ื”ื“ืจื›ื™ื ืœืคื™ืชืจื•ืŸ ืื•ืชื• ืœืงื•ื— ืขื“ื™ื™ืŸ ืœื ื™ื”ื™ื” ืžืกืคื™ืง ื‘ื˜ื•ื— ืฉืื ื™ ืžืกื•ื’ืœ ืœืคืชื•ืจ ืœื• ืืช ื”ื‘ืขื™ื”. ื‘ืžืฆื‘ ื›ื–ื” ื›ื“ืื™ ืœื”ื•ืกื™ืฃ 2-3 ืกื™ืคื•ืจื™ ืžืงืจื” ืขืœ ื‘ืขื™ื•ืช ื“ื•ืžื•ืช ืฉืคืชืจืชื ื•ืœื”ืฆื™ืข ืœืœืงื•ื— ืœื“ื‘ืจ ืขื ื”ืื ืฉื™ื ื”ืจืœื•ื•ื ื˜ื™ื™ื ืื™ืชื ืขื‘ื“ืชื. ื‘ืกื™ืคื•ืจ ืขืœ ื‘ืขื™ื™ืช ื”ื‘ื™ืฆื•ืขื™ื ื‘ืจื™ืืงื˜ ืžืžืงื•ื“ื, ืื—ืจื™ ืฉืื ื™ ืžืชืืจ ืœืœืงื•ื— ืจืฉื™ืžื” ืฉืœ ื›ืœื™ื ื•ื˜ื›ื ื™ืงื•ืช ืฉืื ื™ ื”ื™ื™ืชื™ ืžืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœื–ื”ื•ืช ื•ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ืื ื™ ื™ื›ื•ืœ ืœื”ืฆื™ืข ืœื• ืœื“ื‘ืจ ืขื ืจืืฉื™ ืฆื•ื•ืชื™ื ืื• ืžื ื”ืœื™ ืงื‘ื•ืฆื•ืช ื‘ื—ื‘ืจื•ืช ืื—ืจื•ืช ืฉืขื‘ื“ืชื™ ืื™ืชืŸ ื•ื‘ื”ืŸ ืคืชืจืชื™ ื‘ืขื™ื•ืช ื‘ื™ืฆื•ืขื™ื ื“ื•ืžื•ืช. ื”ืกื•ื“ ืœืฉื™ื—ืช ืžื›ื™ืจื” ื˜ื•ื‘ื” ื”ื•ื ื‘ืกืš ื”ื›ืœ ืžื™ืงื•ื“: ืœื“ื‘ืจ ืขืœ ื”ื‘ืขื™ื”, ืœืชืืจ ืœืœืงื•ื— ืื™ืš ื™ืจืื” ื”ืคื™ืชืจื•ืŸ ื•ืœื”ืฆื™ืข ืœืœืงื•ื— ื“ืจืš ืœืœืžื•ื“ ื™ื•ืชืจ ืขืœ ื”ื™ื›ื•ืœืช ืฉืœื›ื ืœืกืคืง ืืช ืื•ืชื• ืคื™ืชืจื•ืŸ. ืื– ืžื” ื™ื›ื•ืœ ืœื”ืฉืชื‘ืฉ? 1. ืื ืืชื ืœื ืžื–ื”ื™ื ื ื›ื•ืŸ ืืช ื”ื‘ืขื™ื” ืฉืœ ื”ืœืงื•ื—, ืืชื ื”ื•ืœื›ื™ื ืœืชืืจ ืœื• ืคื™ืชืจื•ืŸ ืœื‘ืขื™ื” ืฉืœื ืžืขื ื™ื™ื ืช ืื•ืชื• ื•ื”ืฉื™ื—ื” ืชื”ื™ื” ืžืื•ื“ ื—ื“-ืฆื“ื“ื™ืช. 2. ืื ืžืคืช ื”ื“ืจื›ื™ื ืฉืืชื ืžืชืืจื™ื ืœืคื™ืชืจื•ืŸ ืœื ื ืจืื™ืช ืœืœืงื•ื— ื”ื’ื™ื•ื ื™ืช ืื– ื”ื•ื ื™ืชืงื•ืฃ ืืชื›ื ื‘ืฉืืœื•ืช ื•ื”ืฉื™ื—ื” ืชื”ื™ื” ืžืื•ื“ ืœื ื ืขื™ืžื”. ืžืฆื‘ ื›ื–ื” ื ื•ื‘ืข ืžื”ืชื ื’ืฉื•ืช ื‘ื™ืŸ ื”ื“ืจืš ืฉืืชื ืจื’ื™ืœื™ื ืœืคืชื•ืจ ื‘ืขื™ื•ืช ืœื‘ื™ืŸ ืื™ืš ืฉื”ืœืงื•ื— ืจื•ืฆื” ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื”, ื•ืื ื™ ื‘ืžืฆื‘ ื›ื–ื” ืžืกื™ื™ื ืืช ื”ืฉื™ื—ื” ื•ืžื—ื›ื” ืœืœืงื•ื—ื•ืช ืฉื™ื•ืชืจ ืžืชืื™ืžื™ื ืœืชืคื™ืกืช ื”ืขื•ืœื ืฉืœื™.

ToCode
1 419
# ืื™ืš ืœื‘ื“ื•ืง ืคืขื•ืœื•ืช ื”ืงืฉื•ืจื•ืช ืœื–ืžืŸ ืขื Jest ื• JavaScript ืกื˜ ื‘ื“ื™ืงื•ืช ื˜ื•ื‘ ื™ื›ื•ืœ ืœื—ืกื•ืš ืœื ื• ื”ืจื‘ื” ื–ืžืŸ ื‘ืชื—ื–ื•ืงื” ื•ืคื™ืชื•ื— ืฉืœ ื”ืžืขืจื›ืช, ื›ื™ ื›ืœ ืคืขื ืฉืื ื—ื ื• ืžื’ื™ืขื™ื ืœื”ื•ืกื™ืฃ ืคื™ืฆ'ืจ ื—ื“ืฉ ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ื”ื•ื“ืขื” ืžื™ื™ื“ื™ืช ื›ืฉืงื•ื“ ื—ื“ืฉ ืฉื•ื‘ืจ ืคื™ืฆ'ืจื™ื ื™ืฉื ื™ื ืฉื‘ื ื™ื ื•, ื•ื›ืš ืœืชืงืŸ ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”. ื‘ืฉื‘ื™ืœ ืคื™ื“ื‘ืง ื‘ืจืžื” ื”ื–ืืช ืกื˜ ื”ื‘ื“ื™ืงื•ืช ืฆืจื™ืš ืœื”ื™ื•ืช ืžื”ื™ืจ ื•ื—ืกื›ื•ื ื™ ื‘ืžืฉืื‘ื™ื, ื›ืš ืฉืื•ื›ืœ ืœื”ืจื™ืฅ ืื•ืชื• ืขืœ ื”ืžื—ืฉื‘ ืฉืœื™ ืชื•ืš ื›ื“ื™ ืคื™ืชื•ื— ืืคื™ืœื• ื›ืœ ืคืขื ืฉืื ื™ ืœื•ื—ืฅ Save ื‘ IDE, ื•ืœืงื‘ืœ ืชืฉื•ื‘ื” ืžื”ื™ืจื” ืžื” ื ืฉื‘ืจ. ืกื•ื’ ืื—ื“ ืฉืœ ืคืขื•ืœื•ืช ืฉืขืœื•ืœ ืœืงื—ืช ื™ื•ืชืจ ื–ืžืŸ ื‘ื‘ื“ื™ืงื•ืช ื”ื•ื ื‘ื“ื™ืงื•ืช ืฉืขื•ื ื™ื: ืื ื™ืฉ ืคืขื•ืœื” ืฉืฆืจื™ื›ื” ืœืงืจื•ืช "ื‘ืขื•ื“ 30 ืฉื ื™ื•ืช", ืœืžืฉืœ ืื ื”ืชื—ืœืชื™ ืคืขื•ืœืช ืชืงืฉื•ืจืช ื•ื‘ืขื•ื“ 30 ืฉื ื™ื•ืช ื”ื™ื ืฆืจื™ื›ื” ืœื”ืชื‘ื˜ืœ ื‘ื’ืœืœ Timeout, ืื– ืœื ื”ื™ื™ืชื™ ืจื•ืฆื” ืฉื”ื‘ื“ื™ืงื” ืชืฆื˜ืจืš ืœื—ื›ื•ืช 30 ืฉื ื™ื•ืช ืขื“ ืœืงื‘ืœืช ื”ืชืฉื•ื‘ื”. ื–ื” ื–ืžืŸ ืฉื”ืžื—ืฉื‘ ืœื ืขื•ืฉื” ื‘ื• ื›ืœื•ื ื•ืื ืื ื™ ื›ื•ืชื‘ ืขืฉืจื•ืช ืื• ืžืื•ืช ื‘ื“ื™ืงื•ืช ืื– ื”ืžืกืคืจื™ื ื”ืืœื” ืžืฆื˜ื‘ืจื™ื. ื‘ Jest ื™ืฉ ืžื ื’ื ื•ืŸ ื—ืžื•ื“ ืฉืขื•ื–ืจ ืœื ื• ืœื‘ื“ื•ืง ืคืขื•ืœื•ืช ื”ืงืฉื•ืจื•ืช ื‘ื–ืžืŸ ืฉื ืงืจื Fake Timers. ื–ื” ืขื•ื‘ื“ ื›ื›ื” - ื ื ื™ื— ืฉื™ืฉ ืœื›ื ืืช ื”ืงื•ื“ ื”ื‘ื ืœืžื™ืžื•ืฉ ืฉืœ ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ:
import _ from 'lodash';

export default class MemoryGame {
  constructor(size) {
    this.cards = _.shuffle(_.range(size).flatMap(i => [i, i]).map(i => ({ value: i, visible: false })));
    this.foundPairIndexes = new Set();
    this.activeCardIndex = -1;
    this.hideTimer = null;
  }

  play = (index) => {
    const card = this.cards[index];
    if (card.visible) {
      return;
    }

    card.visible = true;
    clearTimeout(this.hideTimer);
    this.hideTimer = null;

    if (this.activeCardIndex >= 0) {
      if (this.cards[this.activeCardIndex].value === card.value) {
        // Found a match
        this.foundPairIndexes.add(this.activeCardIndex);
        this.foundPairIndexes.add(index);
        this.activeCard = null;
      } else {
        this.hideTimer = setTimeout(this.hideAllCards.bind(this), 2000);
      }
    }
    this.activeCardIndex = index;
  }

  isVisible(index) {
    if (this.foundPairIndexes.has(index)) {
      return true;
    }

    return this.cards[index].visible;
  }

  hideAllCards() {
    this.cards.forEach(c => { c.visible = false; });
  }
}
ื”ืžืฉื—ืง ืžื’ืจื™ืœ N ืงืœืคื™ื ืœืคื™ ื”ื’ื•ื“ืœ ืฉื‘ื™ืงืฉืชื ื•ืžืขืจื‘ื‘ ืื•ืชื, ื•ื”ืคื•ื ืงืฆื™ื” play ืžื˜ืคืœืช ื‘ืœื•ื’ื™ืงื” ืฉืœ ื”ืžืฉื—ืง. ืื ืื™ืŸ ืงืœืคื™ื ื’ืœื•ื™ื™ื ืขืœ ื”ืฉื•ืœื—ืŸ ื”ื™ื ื”ื•ืคื›ืช ืงืœืฃ ื•ืื ื™ืฉ ื›ื‘ืจ ืงืœืฃ ื’ืœื•ื™ ืื– ื”ื™ื ื‘ื•ื“ืงืช ืื ื”ืงืœืฃ ืฉื”ืคื›ื ื• ืขื›ืฉื™ื• ื–ื”ื” ืœืžื” ืฉื›ื‘ืจ ืžื•ืคื™ืข, ืื ื›ืŸ ืžืฆื™ื’ื” ืืช ืฉื ื™ื”ื ื•ืื ืœื ืื– ืžื“ืœื™ืงื” Timer ื›ื“ื™ ืœื”ืคื•ืš ืืช ืฉื ื™ ื”ืงืœืคื™ื ื—ื–ืจื” ื‘ืขื•ื“ ืฉืชื™ ืฉื ื™ื•ืช. ืื’ื‘ - ื‘ืžืฉื—ืง ื™ืฉ ื›ื‘ืจ ื‘ืื’. ื ืกื• ืœืงืจื•ื ืืช ื”ืงื•ื“ ื•ืœืจืื•ืช ืื ืืชื ืžื‘ื™ื ื™ื ืžื”ื•. ื”ื—ืœืง ืฉืงืฉื” ืœื‘ื“ื•ืง ื‘ืžืฉื—ืง ื”ื•ื ื”ืฉืขื•ืŸ, ื•ืคื” jest ื™ื›ื•ืœ ืžืื•ื“ ืœืขื–ื•ืจ ืœื ื•. ื”ืคื•ื ืงืฆื™ื” jest.useFakeTimers() ืžืฉืชืœื˜ืช ืขืœ ื”ืฉืขื•ื ื™ื ื•ืžืืคืฉืจืช ืœื ื• ืœื–ื•ื– ืงื“ื™ืžื” ื‘ื–ืžืŸ ืžื”ืจ ื™ื•ืชืจ; ื”ืคื•ื ืงืฆื™ื” jest.useRealTimers() ืžื—ื–ื™ืจื” ืืช ื”ืžืฆื‘ ืœืงื“ืžื•ืชื•. ืื ื™ ืื•ื”ื‘ ืœื”ืชื—ื™ืœ ืืช ื‘ืœื•ืง ื”ื‘ื“ื™ืงื•ืช ืฉืœื™ ื‘:
  afterEach(function() {
    jest.useRealTimers();
  });
ืขื›ืฉื™ื• ืžื™ ืฉื™ืจืฆื” ื™ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ useFakeTimers ื•ืžื™ ืฉืœื ืœื, ื•ื‘ื›ืœ ืžืงืจื” ื‘ืกื•ืฃ ื›ืœ ื‘ื“ื™ืงื” ื”ืžืฆื‘ ื™ื—ื–ื•ืจ ืœื”ืชื ื”ื’ื•ืช ื”ืจื’ื™ืœื”. ืื—ืจื™ ืฉื™ืฉ ืœื ื• Fake Timers ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” advanceTimersByTime ืฉืœ jest ื›ื“ื™ ืœืจื•ืฅ ืงื“ื™ืžื” ื‘ื–ืžืŸ. ื”ื ื” ื”ื‘ื“ื™ืงื” ืฉืžื•ื•ื“ืืช ืฉืฉืชื™ ืฉื ื™ื•ืช ืื—ืจื™ ืฉื”ืคื›ื ื• ืฉื ื™ ืงืœืคื™ื ืœื ืชื•ืืžื™ื ื”ื ื™ืชื”ืคื›ื• ื—ื–ืจื”:
it('Turns back the cards when pair is not found', () => {
  jest.useFakeTimers();
  const g = new MemoryGame(5);
  const i1 = 0;
  const i2 = g.cards.findIndex(c => c.value !== g.cards[0].value);

  g.play(i1);
  g.play(i2);
  expect(g.isVisible(0)).toBeTruthy();
  expect(g.isVisible(i2)).toBeTruthy();

  jest.advanceTimersByTime(2500);

  expect(g.isVisible(0)).toBeFalsy();
  expect(g.isVisible(i2)).toBeFalsy();
});
ืขื›ืฉื™ื• ืืชื - ืžืฆืืชื ืืช ื”ื‘ืื’? ืกืคืจื• ืžื” ื”ื•ื ื”ื™ื” ื‘ืชื’ื•ื‘ื•ืช. ืœื ืžืฆืืชื ืขื“ื™ื™ืŸ? ื ืกื• ืœื”ืจื™ืฅ ืืฆืœื›ื ืืช jest ืขื ื”ืงื•ื“ ื•ืชื•ื›ื ื™ืช ื”ื‘ื“ื™ืงื” ื•ื ืกื• ืœื‘ื“ื•ืง ื›ืžื” ืฉื™ื•ืชืจ ืชืจื—ื™ืฉื™ื ืขื“ ืฉืชืžืฆืื• ืื•ืชื•.

ToCode
1 419
# ื”ืชื—ืœื•ืช ื”ืžื™ืœื” ื”ืจืืฉื•ื ื” ืฉืœืžื“ืชื™ ื‘ืจื•ืกื™ืช ื”ื™ืชื” mama; ืื—ืจื™ื” ืœืžื“ืชื™ ืืช motor ื•ืื– businessman. ื”ืžืฉืžืขื•ืช ืฉืœ ืฉืœื•ืฉืชืŸ ื–ื”ื” ืœืื ื’ืœื™ืช ื•ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœืœืžื•ื“ ืœื”ื’ื™ื“ ืื•ืชืŸ ื”ื•ื ืœื”ื•ืกื™ืฃ ืืช ื”ืžื‘ื˜ื. ื•ื›ืžื• ื‘ืฉืคื•ืช ื’ื ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ื”ื”ืชื—ืœื” ื”ื™ื ื”ืจื‘ื” ืคืขืžื™ื ื”ื—ืœืง ื”ื›ื™ ืงืœ: ื’ื ื™ืœื“ (ืื• ืžื‘ื•ื’ืจ) ืฉืœื ื›ืชื‘ ืงื•ื“ ืžืขื•ืœื ื™ืฆืœื™ื— ืชื•ืš ืžืกืคืจ ืฉืขื•ืช ืœื‘ื ื•ืช ืชื•ื›ื ื™ืช ืคืฉื•ื˜ื” ื‘ืกืงืจืฅ', ื•ืื ืืชื ื›ื‘ืจ ื™ื•ื“ืขื™ื ืœืชื›ื ืช ืื– ืื ื™ ื‘ื˜ื•ื— ืฉืชืฆืœื™ื—ื• ืœื›ืชื•ื‘ ืืช ื”ืชื•ื›ื ื™ืช ื”ืจืืฉื•ื ื” ื‘"ืœื-ืžืฉื ื”-ืื™ื–ื•-ืฉืคื”" ืชื•ืš ืžืกืคืจ ืฉืขื•ืช. ืขื ืืชืจื™ื ื›ืžื• replit.com ื•ื›ืœื™ื ื›ืžื• ื“ื•ืงืจ ืืคื™ืœื• ื”ืชื™ืง ืฉืœ ื”ื”ืชืงื ื•ืช ื“ื™ ืžืื—ื•ืจื™ื ื•. ื•ืืคื™ืœื• ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืืช ื›ืœ ื–ื” ืื ื—ื ื• ืขื“ื™ื™ืŸ ื ืชืงืขื™ื ืœืคื ื™ ืฉืžืชื—ื™ืœื™ื ื‘ื’ืœืœ ื›ืœ ืžื™ื ื™ ืคื—ื“ื™ื - ื‘ื’ืœืœ ืฉืื•ืœื™ ืฆืจื™ืš ืœื“ืขืช ื™ื•ืชืจ ืœืคื ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืงื—ืช ืืช ื”ืฆืขื“ ื”ืจืืฉื•ืŸ (ื•ืื– ื”ื•ืœื›ื™ื ืœืงืจื•ื 5 ืกืคืจื™ื ืขืœ ืงื•ื‘ืจื ื˜ืก ื‘ืžืงื•ื ืคืฉื•ื˜ ืœื”ืจื™ื ืžืขืจื›ืช ืงื˜ื ื”), ื‘ื’ืœืœ ืฉืื•ืœื™ ืื ืื ื™ ืืงื— ืืช ื”ืฆืขื“ ืื ื™ ืืฆื˜ืจืš ืœืืžืฅ ืืช ื”ื˜ื›ื ื•ืœื•ื’ื™ื” ื”ื—ื“ืฉื” ื•ื”ืžืคื—ื™ื“ื” ื”ื”ื™ื ื•ืื– ื–ื” ื™ืกื‘ืš ืื•ืชื™ ื‘ืขืชื™ื“ (ื›ืŸ ื’ื™ื˜ ืื ื™ ืžืกืชื›ืœ ืขืœื™ืš), ื‘ื’ืœืœ ืฉืื•ืœื™ ืื’ืœื” ืฉืื™ืžืงืก ื”ื•ื ืœื ื›ื–ื” ื’ืจื•ืข ื•ืื– ืžื” ืื ื™ ืืกืคืจ ืœื›ืœ ื”ื—ื‘ืจื™ื ืžื”ืงื‘ื•ืฆื” ืฉืœ ื”-ื•ื™ื. ื‘ื•ืื• ื ืคืจื™ื“. ื”ืคื—ื“ ืฉื, ื”ื•ื ืœื ื™ืœืš ืœืฉื•ื ืžืงื•ื. ื•ืœื™ื“ื• ื’ื ื”ื™ื›ื•ืœืช ืœืงื—ืช ืฆืขื“ ืจืืฉื•ืŸ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ืื•ืชื” ืืชื ืจื•ืฆื™ื ืœืœืžื•ื“. ื”ื‘ื—ื™ืจื” ื‘ืคื—ื“ ืžืฉืื™ืจื” ืื•ืชื ื• ื‘ืื•ืชื• ืžืงื•ื; ื”ื‘ื—ื™ืจื” ืœืงื—ืช ืืช ื”ืฆืขื“ ื”ืจืืฉื•ืŸ ืคื•ืชื—ืช ืืช ื”ื“ืœืช ืœื”ื›ื™ืจ ืฉืคื” ื—ื“ืฉื” ื•ืฉื•ืœื—ืช ืืช ื”ืคื—ื“ ืœืฉืžื•ืจ ืฉืœื ื ืชืงืจื‘ ืœื˜ื›ื ื•ืœื•ื’ื™ื” ืื—ืจืช.

ToCode
1 419
# ื˜ื™ืค ื‘ืืฉ: ื”ืฉืชืžืฉื• ื‘ null glob ื›ืฉืฆืจื™ืš ืืช ื”ืœื•ืœืื” ื”ืงืฆืจื” ื”ื–ืืช ื›ืชื‘ืชื™ ื‘ืกืงืจื™ืคื˜ ื‘ืœื™ ืœื—ืฉื•ื‘ ื™ื•ืชืจ ืžื“ื™:
#!/bin/bash -e

for json_file in /data/*
do
  echo "Importing JSON file $json_file"
  python import_json.py "$json_file"
  echo "-- Done"
done
ื•ืœืžื” ื‘ืœื™ ืœื—ืฉื•ื‘? ื›ื™ ืื ื”ืกืงืจื™ืคื˜ import_json.py ื™ื ืกื” ืœืคืชื•ื— ืืช ื”ืงื•ื‘ืฅ ืฉื”ื•ื ืžืงื‘ืœ ืœืงืจื™ืื”, ื•ื”ืชื™ืงื™ื” ืจื™ืงื”, ืื ื—ื ื• ื ืงื‘ืœ ืืช ื”ืฉื’ื™ืื”:
FileNotFoundError: [Errno 2] No such file or directory: '/data/*'
ื”ืกื™ื‘ื” ืœืฉื’ื™ืื” ื”ืžื•ื–ืจื” ื”ื™ื ืฉ bash ืžืคืขื ื— ืืช ื”ื‘ื™ื˜ื•ื™ /data/* ืœื”ื™ื•ืช ื”ื˜ืงืกื˜ ื”ืคืฉื•ื˜ /data/* ื•ืœื ืจืฉื™ืžืช ืฉืžื•ืช ื”ืงื‘ืฆื™ื ื‘ืชื™ืงื™ื” ืฉื - ื‘ื’ืœืœ ืฉืื™ืŸ ืงื‘ืฆื™ื ื‘ืื•ืชื” ืชื™ืงื™ื”. ืืคืฉืจ ืœืจืื•ืช ืืช ื–ื” ื‘ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ื™ื•ืชืจ ื‘ืœื™ ืœื•ืœืื” ืื• ืคื™ื™ืชื•ืŸ ืื ืคืฉื•ื˜ ื ื›ืชื•ื‘ ืืช ืฉืชื™ ื”ืคืงื•ื“ื•ืช:
# this will print all the files in /etc
$ echo /etc/*

# but this will just print "/data/*"
$ echo /data/*
ื”ืคืงื•ื“ื” ื”ืจืืฉื•ื ื” ื‘ืืžืช ืชื“ืคื™ืก ืืช ื›ืœ ื”ืงื‘ืฆื™ื ื•ื”ืชื™ืงื™ื•ืช ืžืชื•ืš /etc, ื•ื”ืฉื ื™ื” ืชื“ืคื™ืก ืคืฉื•ื˜ /data/*. ื›ืžื•ื‘ืŸ ืฉื”ืžื—ืจื•ื–ืช ืฉื”ื•ื“ืคืกื” ืžื”ืคืงื•ื“ื” ื”ืฉื ื™ื” ืื™ื ื” ื‘ืืžืช ืฉื ืงื•ื‘ืฅ ื•ืœื›ืŸ ืื™ ืืคืฉืจ ืœืคืชื•ื— ืื•ืชื”. ื”ื“ืจืš ื”ื›ื™ ืงืœื” ืœืฆืืช ืžื–ื” ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ nullglob, ืฉื–ื” ืื•ืžืจ ืฉืื ื”ื‘ื™ื˜ื•ื™ ืœื ืžืชืื™ื ืœื›ืœื•ื ืื– ื‘ืืฉ ื™ื—ื–ื™ืจ ืžื—ืจื•ื–ืช ืจื™ืงื”. ื ืกื• ืืช ื–ื”:
$ shopt -s nullglob
$ echo /data/*
ื•ื”ืคืขื ืœื ืžืงื‘ืœื™ื ืฉื•ื ืคืœื˜. ื‘ืชื•ืš ื”ืœื•ืœืื” ืื ื™ ืžืงื‘ืœ ื‘ื“ื™ื•ืง ืืช ื”ื”ืชื ื”ื’ื•ืช ื”ืจืฆื•ื™ื”:
#!/bin/bash -e

shopt -s nullglob

for json_file in /data/*
do
  echo "Importing JSON file $json_file"
  python import_json.py "$json_file"
  echo "-- Done"
done
ื”ืคืขื ื”ืกืงืจื™ืคื˜ ืœื ื™ื ืกื” ืœืคืชื•ื— ืงื•ื‘ืฅ ืขื ื”ืฉื ื”ืžื•ื–ืจ /data* ื•ืคืฉื•ื˜ ืœื ื™ื‘ืฆืข ืืฃ ืคืขื ืืช ื’ื•ืฃ ื”ืœื•ืœืื” ื›ื™ ื‘ืืžืช ืื™ืŸ ืงื‘ืฆื™ื ืฉืžืชืื™ืžื™ื ืœื‘ื™ื˜ื•ื™.