рдбрдХрд░рдорд╛ VueJS + NodeJS + MongoDB рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд░реА рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реНрдиреЗ

рдбрдХрд░рдорд╛ VueJS + NodeJS + MongoDB рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд░реА рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реНрдиреЗ
рддрдкрд╛рдИрдВрд▓реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рд▓реЗрдЦрдмрд╛рдЯ рдмреБрдЭреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдореИрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реЗрдВред рдирдпрд╛рдБ рдЯреЛрд▓реАрдорд╛ рдкрд╣рд┐рд▓реЛ рджрд┐рдирд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЙрд╣реА рддрд░рд┐рдХрд╛рдорд╛ рдЬрд╛рдиреНрдЫрдиреН: рдмреНрдпрд╛рдХрдиреНрдбрд░ рдорд╕рдБрдЧ рдмрд╕реНрдЫ рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд╛рдкрдирд╛ рд░ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рдЬрд╛рджреБрдИ рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрджрдЫред рдбрдХрд░ рдлреНрд░рдиреНрдЯ-рдПрдиреНрдб рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЫ рдХрд┐рдирднрдиреЗ ... рдмреНрдпрд╛рдХрдЗрдиреНрдб рдкреНрд░рд╛рдпрдГ PHP/Java/Python/C# рд╕реНрдЯреНрдпрд╛рдХрд╣рд░реВрдХреЛ рд╡рд┐рд╕реНрддреГрдд рджрд╛рдпрд░рд╛рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рд╣реБрдиреНрдЫ, рд░ рдЕрдЧрд╛рдбрд┐ рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрдерд╛рдкрдирд╛ рд░ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ рд╡рд┐рдЪрд▓рд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рдХреЗрд╡рд▓ рдПрдХ рдард╛рдЙрдБрдорд╛ рдореИрд▓реЗ рдкрд╛рд░рджрд░реНрд╢реА рддреИрдирд╛рддреА, рд▓рдЧрд╣рд░реВ, рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд╕рд╛рде рдбрдХрд░-рдЬреЗрдирдХрд┐рдиреНрд╕ рд╕рдВрдпреЛрдЬрди рджреЗрдЦреЗрдХреЛ рдЫреБред

рдбрдХрд░рдХреЛ рдмрд╛рд░реЗрдорд╛ рдзреЗрд░реИ рд╡рд┐рд╕реНрддреГрдд рд▓реЗрдЦрд╣рд░реВ рд▓реЗрдЦрд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕ рд▓реЗрдЦрд▓реЗ VueJS/Vue рд░рд╛рдЙрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдХрд▓ рдкреГрд╖реНрда рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫ, рд╕рд░реНрднрд░ рднрд╛рдЧ NodeJS рд╕рдБрдЧ RESTful API рдХреЛ рд░реВрдкрдорд╛ рдЫ, рд░ MongoDB рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдбрдХрд░ рдХрдореНрдкреЛрдЬ рдзреЗрд░реИ рдХрдиреНрдЯреЗрдирд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░ рдЪрд▓рд╛рдЙрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рддрдкрд╛рдИрд▓рд╛рдИ рдбрдХрд░ рдХрд┐рди рдЪрд╛рд╣рд┐рдиреНрдЫ?

рдбрдХрд░рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рдЕрдм рдЖрдлреНрдиреИ рдореЗрд╕рд┐рдирдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╡рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕рдВрдЧрддрддрд╛рд╕рдБрдЧ рд╕рдореНрдЭреМрддрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рддрдкрд╛рдИрдВрд▓реЗ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рднрдиреЗрдХреЛ рдбрдХрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХрдиреНрд╕реЛрд▓рдорд╛ рез-реи рдЖрджреЗрд╢рд╣рд░реВ рдЯрд╛рдЗрдк рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпреЛ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рд╕рдмреИ рднрдиреНрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд▓рд┐рдирдХреНрд╕ рдорд╛ рдЫред

рд╕реБрд░реБ рдЧрд░реНрджреИ

рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдбрдХрд░ рд░ рдбрдХрд░ рд░рдЪрдирд╛

рдлреЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛

рд╣рд╛рдореА рдЧреНрд░рд╛рд╣рдХ рд░ рд╕рд░реНрднрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ 2 рдлреЛрд▓реНрдбрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВред .yml рд╡рд┐рд╕реНрддрд╛рд░ рднрдПрдХреЛ рдлрд╛рдЗрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╣реЛ рдбрдХрд░ рд░рдЪрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬрд╣рд╛рдБ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫрдиреНред
Docker-compose.yml:

version: "3"
services:
  mongo:
    container_name: mongo
    hostname: mongo
    image: mongo
    ports:
      - "27017:27017"
  server:
    build: server/
    #command: node ./server.js #╨╖╨┤╨╡╤Б╤М ╨╝╨╛╨╢╨╜╨╛ ╨┐╨╡╤А╨╡╨╖╨░╨┐╨╕╤Б╨░╤В╤М CMD ╨╕╨╖ Dockerfile ╨▓ /server
    ports:
      - "3000:3000"
    links:
      - mongo
  client:
    build: client/
    #command: http-server ./dist #╨╖╨┤╨╡╤Б╤М ╨╝╨╛╨╢╨╜╨╛ ╨┐╨╡╤А╨╡╨╖╨░╨┐╨╕╤Б╨░╤В╤М CMD ╨╕╨╖ Dockerfile ╨▓ /client
    network_mode: host
    ports:
      - "8089:8089"
    depends_on:
      - server

рд╣рд╛рдореА Docker рдорд╛ 3 рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ: NodeJS, MongoDB рд░ Vue рдорд╛ рд╕реНрдерд┐рд░рдХрд╛ рд▓рд╛рдЧрд┐ред рд╕рд░реНрднрд░рдорд╛ рдЧреНрд░рд╛рд╣рдХ рдЬрдбрд╛рди рдЧрд░реНрди рдердкрд┐рдпреЛ рд╕рд░реНрднрд░ рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред MongoDB рд▓рд╛рдИ рд╕рд░реНрднрд░ API рд╕рдБрдЧ рд▓рд┐рдЩреНрдХ рдЧрд░реНрди, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓рд┐рдЩреНрдХ mongoред рд╕рд░реНрднрд░, рдЧреНрд░рд╛рд╣рдХ, рдордЩреНрдЧреЛ - рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рдирд╛рдоред

VueJS рдЧреНрд░рд╛рд╣рдХ

рдлреЛрд▓реНрдбрд░рдорд╛ / рдЧреНрд░рд╛рд╣рдХ рдЖрд╡реЗрджрди VueJS рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ Vue Cliред рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛, рдХреНрд▓рд╛рдЗрдиреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлреЛрд▓реНрдбрд░рдорд╛ рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕реЗрдЯрдорд╛ рдирд┐рд░реНрдорд┐рдд рд╣реБрдиреНрдЫ /рдЬрд┐рд▓реНрд▓рд╛ред рдбрдХрд░рдлрд╛рдЗрд▓рд▓реЗ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрджреЗрд╢рд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫ:

FROM node:10
WORKDIR /client
COPY ./package*.json ./
RUN npm install
RUN npm install -g http-server
COPY . .
RUN npm run build
EXPOSE 8081
CMD ["npm", "test:dev"]

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ package.json рд▓рд╛рдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХрд╛ рдмрд╛рдБрдХреА рдлрд╛рдЗрд▓рд╣рд░реВрдмрд╛рдЯ рдЕрд▓рдЧ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реА рд╕реНрдерд╛рдкрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреЛ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдХрд╛рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЧрд░рд┐рдиреНрдЫ рддрд╛рдХрд┐ /node_modules рдлреЛрд▓реНрдбрд░рдХреЛ рд╕рд╛рдордЧреНрд░реА рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛ рдХреНрдпрд╛рд╕ рдЧрд░рд┐рдиреЗрдЫред рдкреНрд░рддреНрдпреЗрдХ рдЖрджреЗрд╢ рд▓рд╛рдЗрди рдЕрд▓рдЧ рдХреНрдпрд╛рд╕ рдЫред

рдЕрдиреНрддрдорд╛, рдЬрдм рдХрдиреНрдЯреЗрдирд░ рд╕реБрд░реБ рд╣реБрдиреНрдЫ, рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреНрдЫ npm run devред рдпреЛ рдЖрджреЗрд╢ package.json рдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ:


"scripts": {
	 "test:dev": "http-server dist -p 8081 -c 1 --push-state"
}

рдлреЛрд▓реНрдбрд░рдмрд╛рдЯ рдлрд╛рдЗрд▓рд╣рд░реВ рдЪрд▓рд╛рдЙрди /рдЬрд┐рд▓реНрд▓рд╛, рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рд░реВрдкрдорд╛ рд╕реНрдерд╛рдкрд┐рдд http-server, рд░ dev-рдирд┐рд░реНрднрд░рддрд╛рдорд╛ рдкреНрдпрд╛рдХреЗрдЬ spa-http-serverрддрд╛рдХрд┐ Vue рд░рд╛рдЙрдЯрд░ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред --push-state рдЭрдгреНрдбрд╛ index.html рдорд╛ рд░рд┐рдбрд┐рд░реЗрдХреНрдЯ рд╣реБрдиреНрдЫред рез рд╕реЗрдХреЗрдиреНрдбрдХреЛ рдорд╛рди рднрдПрдХреЛ -c рдЭрдгреНрдбрд╛ рдердкрд┐рдпреЛ http-рд╕рд░реНрднрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдХреНрдпрд╛рд╕ рдЧрд░реЗрдиред рдпреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рд╣реЛ; рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛ рдпреЛ nginx рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рдЫред

Vuex рд╕реНрдЯреЛрд░рдорд╛ рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ apiHost: 'http://localhost:3000', рдЬрд╣рд╛рдБ NodeJS Api рдкреЛрд░реНрдЯ рджрд░реНрддрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рддрдпрд╛рд░ рдЫред рдЕрдм рдЧреНрд░рд╛рд╣рдХрдмрд╛рдЯ рдкрдЫрд╛рдбрд┐ рд╕рдмреИ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдпреЛ url рдорд╛ рдЬрд╛рдиреНрдЫрдиреНред

NodeJS рд╕рд░реНрднрд░ API

рдлреЛрд▓реНрдбрд░рдорд╛ /server рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН server.js рд░ рдбрдХрд░рдлрд╛рдЗрд▓:


FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

╨Т server.js рд╕рдВрдХреЗрдд URL рдбрд╛рдЯрд╛рдмреЗрд╕ рдХреЛ рд▓рд╛рдЧреА const url = 'mongodb://mongo:27017/';ред рдЧреНрд░рд╛рд╣рдХрдмрд╛рдЯ рдХреНрд░рд╕-рдбреЛрдореЗрди рдЕрдиреБрд░реЛрдзрд╣рд░реВрд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИ:


const clientUrl = 'http://localhost:8081';
const corsOptions = {
  origin: clientUrl,
  optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
};
app.use(cors());
app.all('/*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', clientUrl);
  res.header('Access-Control-Allow-Headers', 'X-Requested-With');
  next();
});
  app.get('/getProducts', cors(corsOptions), (req, res) => {
    products.getContent
      .then(data => res.json(data), err => res.json(err));
  });
  app.get('/getUsers', cors(corsOptions), (req, res) => {
    db.getUsers()
      .then(data => res.json(data), err => res.json(err));
  });

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН рд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН docker-compose build рдЫрд╡рд┐рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд░ docker-compose up рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрдиред рдЯреЛрд▓реАрд▓реЗ 3 рдХрдиреНрдЯреЗрдирд░ рдЙрдард╛рдЙрдиреЗрдЫ: рд╕рд░реНрднрд░, рдЧреНрд░рд╛рд╣рдХ, рдордВрдЧреЛред NodeJS рд╕рд░реНрднрд░рдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдлреЛрд▓реНрдбрд░рдорд╛ рд▓рд┐рдЩреНрдХ рдЧрд░реЗрд░ рд╣рдЯ-рд░рд┐рд▓реЛрдб рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд░ рд╡рд┐рдХрд╛рд╕ рдЕрдиреНрддрд░реНрдЧрдд рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рддрд╛рддреЛ рд░рд┐рд▓реЛрдбрдХреЛ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рд╕реБрд░реВ рдЧрд░рд┐рдиреБ рдкрд░реНрдЫ, рдЫреБрдЯреНрдЯреИ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ рд╕рд░реНрднрд░ ╨╕ рдореЛрдиреНрдЧреЛред рдЫреБрдЯреНрдЯреИ рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрди, рдпрд╕рдХреЛ рдирд╛рдо рдорд╛рддреНрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН docker-compose up clientред рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН prune рд░ рд╕реНрд░реЛрддрд╣рд░реВ рдЦрд╛рд▓реА рдЧрд░реНрди рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ, рдиреЗрдЯрд╡рд░реНрдХрд╣рд░реВ, рд░ рдЫрд╡рд┐рд╣рд░реВ рдореЗрдЯрд╛рдЙрдБрджреИред

рддрдкрд╛рдИрдВ рдкреВрд░рд╛ рдХреЛрдб рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдЭреИ рд╡рд┐рдХрд╛рд╕ рдЕрдиреНрддрд░реНрдЧрдд рдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди