Как запустить node js через консоль
Перейти к содержимому

Как запустить node js через консоль

  • автор:

Как запустить Node.js приложение

Если вы устанавливали NodeJS с помощью стандартного установщика с официального сайта, то так:

  1. Открываем консоль cmd
  2. Переходим в папку Z:\home\localhost\www\server командой cd Z:\home\localhost\www\server
  3. Запускаем сервер node server.js
  1. Устанавливаете NodeJS
  2. Создаете файл mywebserver.js

Добавляете в содержание mywebserver.js

Открываете правой кнопкой мыши mywebserver.js c помощью программы Node.js

Nicolas Chabanovsky's user avatar

IgorBeaz's user avatar

PS: но все же лучше установить Linux(что я и сделал недавно;)), там более удобно работать с терминалом. можно Linux установить вторым ОС)

Emir Mamashov's user avatar

Попробуй исполняемый файл server.js запустить через контекстное меню. Правая кнопка—>Открыть с помощью—>И выбираеш Node. В командной строке должно появиться Server runnig at http://127.0.0.1:8124/. И дальше вбиваеш этот адрес в браузер.

Можно с помощью VSCode.

Если скачать NodeJS, то можно будет запустить JS-код в VSCode.

Просто устанавливаем NodeJS, потом заходим в VSCode, и в верхнем меню надо нажать "RUN", потом можно выбрать, с помощью чего мы хотим запустить код, мы вибираем "С помощью NodeJS". Выйдет консоль, и там будет результат.

# Getting started with Node.js

In this example we’ll create an HTTP server listening on port 1337, which sends Hello, World! to the browser. Note that, instead of using port 1337, you can use any port number of your choice which is currently not in use by any other service.

(opens new window) (a module included in Node.js’s source, that does not require installing additional resources). The http module provides the functionality to create an HTTP server using the http.createServer()

(opens new window) method. To create the application, create a file containing the following JavaScript code.

Save the file with any file name. In this case, if we name it hello.js we can run the application by going to the directory the file is in and using the following command:

The created server can then be accessed with the URL http://localhost:1337

A simple web page will appear with a “Hello, World!” text at the top, as shown in the screenshot below.

Screenshot

# Hello World command line

Node.js can also be used to create command line utilities. The example below reads the first argument from the command line and prints a Hello message.

To run this code on an Unix System:

  1. Create a new file and paste the code below. The filename is irrelevant.
  2. Make this file executable with chmod 700 FILE_NAME
  3. Run the app with ./APP_NAME David

On Windows you do step 1 and run it with node APP_NAME David

# Hello World with Express

The following example uses Express to create an HTTP server listening on port 3000, which responds with "Hello, World!". Express is a commonly-used web framework that is useful for creating HTTP APIs.

First, create a new folder, e.g. myApp . Go into myApp and make a new JavaScript file containing the following code (let’s name it hello.js for example). Then install the express module using npm install —save express from the command line. Refer to this documentation

(opens new window) for more information on how to install packages.

From the command line, run the following command:

Open your browser and navigate to http://localhost:3000 or http://127.0.0.1:3000 to see the response.

For more information about the Express framework, you can check the Web Apps With Express

# Installing and Running Node.js

To begin, install Node.js on your development computer.

Windows: Navigate to the download page

(opens new window) and download/run the installer.

Mac: Navigate to the download page

(opens new window) and download/run the installer. Alternatively, you can install Node via Homebrew using brew install node . Homebrew is a command-line package mananger for Macintosh, and more information about it can be found on the Homebrew website

Linux: Follow the instructions for your distro on the command line installation page

# Running a Node Program

To run a Node.js program, simply run node app.js or nodejs app.js , where app.js is the filename of your node app source code. You do not need to include the .js suffix for Node to find the script you’d like to run.

Alternatively under UNIX-based operating systems, a Node program may be executed as a terminal script. To do so, it needs to begin with a shebang pointing to the Node interpreter, such as #!/usr/bin/env node . The file also has to be set as executable, which can be done using chmod . Now the script can be directly run from the command line.

# Debugging Your NodeJS Application

You can use the node-inspector. Run this command to install it via npm:

Then you can debug your application using

# Debugging natively

You can also debug node.js natively by starting it like this:

To breakpoint your debugger exactly in a code line you want, use this:

For more information see here

In node.js 8 use the following command:

Then open about://inspect in a recent version of Google Chrome and select your Node script to get the debugging experience of Chrome’s DevTools.

# Hello World basic routing

Once you understand how to create an HTTP Server

(opens new window) with node, it’s important to understand how to make it "do" things based on the path that a user has navigated to. This phenomenon is called, "routing".

The most basic example of this would be to check if (request.url === ‘some/path/here’) , and then call a function that responds with a new file.

An example of this can be seen here:

If you continue to define your "routes" like this, though, you’ll end up with one massive callback function, and we don’t want a giant mess like that, so let’s see if we can clean this up.

First, let’s store all of our routes in an object:

Now that we’ve stored 2 routes in an object, we can now check for them in our main callback:

Now every time you try to navigate your website, it will check for the existence of that path in your routes, and it will call the respective function. If no route is found, the server will respond with a 404 (Not Found).

And there you have it—routing with the HTTP Server API is very simple.

# Hello World in the REPL

When called without arguments, Node.js starts a REPL (Read-Eval-Print-Loop) also known as the “Node shell”.

At a command prompt type node .

At the Node shell prompt > type "Hello World!"

# Deploying your application online

When you deploy your app to a (Node.js-specific) hosted environment, this environment usually offers a PORT -environment variable that you can use to run your server on. Changing the port number to process.env.PORT allows you to access the application.

Also, if you would like to access this offline while debugging, you can use this:

where 3000 is the offline port number.

# Core modules

Node.js is a Javascript engine (Google’s V8 engine for Chrome, written in C++) that allows to run Javascript outside the browser. While numerous libraries are available for extending Node’s functionalities, the engine comes with a set of core modules implementing basic functionalities.

There’s currently 34 core modules included in Node:

This list was obtained from the Node documentation API https://nodejs.org/api/all.html

# All core modules at-a-glance

assert

The assert module provides a simple set of assertion tests that can be used to test invariants.

buffer

Prior to the introduction of TypedArray

(opens new window) in ECMAScript 2015 (ES6), the JavaScript language had no mechanism for reading or manipulating streams of binary data. The Buffer class was introduced as part of the Node.js API to make it possible to interact with octet streams in the context of things like TCP streams and file system operations.

(opens new window) has been added in ES6, the Buffer class implements the Uin t8Array API in a manner that is more optimized and suitable for Node.js’ use cases.

c/c++_addons

Node.js Addons are dynamically-linked shared objects, written in C or C++, that can be loaded into Node.js using the require() function , and used just as if they were an ordinary Node.js module. They are used primarily to provide an interface between JavaScript running in Node.js and C/C++ libraries.

child_process

The child_process module provides the ability to spawn child processes in a manner that is similar, but not identical, to popen(3).

A single instance of Node.js runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node.js processes to handle the load. The cluster module allows you to easily create child processes that all share server ports.

console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

crypto

The crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL’s hash, HMAC, cipher, decipher, sign and verify functions.

deprecated_apis

Node.js may deprecate APIs when either: (a) use of the API is considered to be unsafe, (b) an improved alternative API has been made available, or (c) breaking changes to the API are expected in a future major release.

dns

The dns module contains functions belonging to two different categories:

domain

This module is pending deprecation. Once a replacement API has been finalized, this module will be fully deprecated. Most end users should not have cause to use this module. Users who absolutely must have the functionality that domains provide may rely on it for the time being but should expect to have to migrate to a different solution in the future.

Much of the Node.js core API is built around an idiomatic asynchronous event-driven architecture in which certain kinds of objects (called "emitters") periodically emit named events that cause Function objects ("listeners") to be called.

fs

File I/O is provided by simple wrappers around standard POSIX functions. To use this module do require(‘fs’) . All the methods have asynchronous and synchronous forms.

The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly chunk-encoded, messages. The interface is careful to never buffer entire requests or responses—the user is able to stream data.

https

HTTPS is the HTTP protocol over TLS/SSL. In Node.js this is implemented as a separate module.

module

Node.js has a simple module loading system. In Node.js, files and modules are in one-to-one correspondence (each file is treated as a separate module).

net

The net module provides you with an asynchronous network wrapper. It contains functions for creating both servers and clients (called streams). You can include this module with require(‘net’); .

os

The os module provides a number of operating system-related utility methods.

path

The path module provides utilities for working with file and directory paths.

punycode

The version of the punycode module bundled in Node.js is being deprecated.

querystring

The querystring module provides utilities for parsing and formatting URL query strings.

The readline module provides an interface for reading data from a Readable stream (such as process.stdin ) one line at a time.

repl

The repl module provides a Read-Eval-Print-Loop (REPL) implementation that is available both as a standalone program or includible in other applications.

A stream is an abstract interface for working with streaming data in Node.js. The stream module provides a base API that makes it easy to build objects that implement the stream interface.

There are many stream objects provided by Node.js. For instance, a request to an HTTP server and process.stdout are both stream instances.

string_decoder

The string_decoder module provides an API for decoding Buffer objects into strings in a manner that preserves encoded multi-byte UTF-8 and UTF-16 characters.

timers

The timer module exposes a global API for scheduling functions to be called at some future period of time. Because the timer functions are globals, there is no need to call require(‘timers’) to use the API.

The timer functions within Node.js implement a similar API as the timers API provided by Web Browsers but use a different internal implementation that is built around the Node.js Event Loop

tls_(ssl)

The tls module provides an implementation of the Transport Layer Security (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL.

tracing

Trace Event provides a mechanism to centralize tracing information generated by V8, Node core, and userspace code.

Tracing can be enabled by passing the —trace-events-enabled flag when starting a Node.js application.

tty

The tty module provides the tty.ReadStream and tty.WriteStream classes. In most cases, it will not be necessary or possible to use this module directly.

dgram

The dgram module provides an implementation of UDP Datagram sockets.

url

The url module provides utilities for URL resolution and parsing.

util

The util module is primarily designed to support the needs of Node.js’ own internal APIs. However, many of the utilities are useful for application and module developers as well.

v8

The v8 module exposes APIs that are specific to the version of V8

(opens new window) built into the Node.js binary.

Note: The APIs and implementation are subject to change at any time.

vm

The vm module provides APIs for compiling and running code within V8 Virtual Machine contexts. JavaScript code can be compiled and run immediately or compiled, saved, and run later.

Note: The vm module is not a security mechanism. Do not use it to run untrusted code.

zlib

The zlib module provides compression functionality implemented using Gzip and Deflate/Inflate.

# TLS Socket: server and client

The only major differences between this and a regular TCP connection are the private Key and the public certificate that you’ll have to set into an option object.

# How to Create a Key and Certificate

The first step in this security process is the creation of a private Key. And what is this private key? Basically, it’s a set of random noise that’s used to encrypt information. In theory, you could create one key, and use it to encrypt whatever you want. But it is best practice to have different keys for specific things. Because if someone steals your private key, it’s similar to having someone steal your house keys. Imagine if you used the same key to lock your car, garage, office, etc.

openssl genrsa -out private-key.pem 1024

Once we have our private key, we can create a CSR (certificate signing request), which is our request to have the private key signed by a fancy authority. That is why you have to input information related to your company. This information will be seen by the signing authority, and used to verify you. In our case, it doesn’t matter what you type, since in the next step we’re going to sign our certificate ourselves.

openssl req -new -key private-key.pem -out csr.pem

Now that we have our paper work filled out, it’s time to pretend that we’re a cool signing authority.

openssl x509 -req -in csr.pem -signkey private-key.pem -out public-cert.pem

Now that you have the private key and the public cert, you can establish a secure connection between two NodeJS apps. And, as you can see in the example code, it is a very simple process.

# Important!

Since we created the public cert ourselves, in all honesty, our certificate is worthless, because we are nobodies. The NodeJS server won’t trust such a certificate by default, and that is why we need to tell it to actually trust our cert with the following option rejectUnauthorized: false. Very important: never set this variable to true in a production environment.

# TLS Socket Server

# TLS Socket Client

# How to get a basic HTTPS web server up and running!

Once you have node.js installed on your system, you can just follow the procedure below to get a basic web server running with support for both HTTP and HTTPS!

# Step 1 : Build a Certificate Authority

# Step 2 : Install your certificate as a root certificate

# Step 3 : Starting your node server

First, you want to create a server.js file that contains your actual server code.

The minimal setup for an HTTPS server in Node.js would be something like this :

If you also want to support http requests, you need to make just this small modification :

Руководство по Node.js, часть 1: общие сведения и начало работы

Мы начинаем публикацию серии материалов, которые представляют собой поэтапный перевод руководства по Node.js для начинающих. А именно, в данном случае «начинающий» — это тот, кто обладает некоторыми познаниями в области браузерного JavaScript. Он слышал о том, что существует серверная платформа, программы для которой тоже пишут на JS, и хотел бы эту платформу освоить. Возможно, вы найдёте здесь что-то полезное для себя и в том случае, если уже знакомы с Node.js.

Кстати, в прошлом году у нас был похожий по масштабам проект, посвящённый bash-скриптам. Тогда мы, после публикации всех запланированных материалов, собрали их в виде PDF-файла. Так же планируется поступить и в этот раз.

Сегодня мы обсудим особенности Node.js, начнём знакомство с экосистемой этой платформы и напишем серверный «Hello World».

Обзор Node.js

Node.js — это опенсорсная кроссплатформенная среда выполнения для JavaScript, которая работает на серверах. С момента выпуска этой платформы в 2009 году она стала чрезвычайно популярной и в наши дни играет весьма важную роль в области веб-разработки. Если считать показателем популярности число звёзд, которые собрал некий проект на GitHub, то Node.js, у которого более 50000 звёзд, это очень и очень популярный проект.

Платформа Node.js построена на базе JavaScript движка V8 от Google, который используется в браузере Google Chrome. Данная платформа, в основном, используется для создания веб-серверов, однако сфера её применения этим не ограничивается.

Рассмотрим основные особенности Node.js.

▍Скорость

Одной из основных привлекательных особенностей Node.js является скорость. JavaScript-код, выполняемый в среде Node.js, может быть в два раза быстрее, чем код, написанный на компилируемых языках, вроде C или Java, и на порядки быстрее интерпретируемых языков наподобие Python или Ruby. Причиной подобного является неблокирующая архитектура платформы, а конкретные результаты зависят от используемых тестов производительности, но, в целом, Node.js — это очень быстрая платформа.

▍Простота

Платформа Node.js проста в освоении и использовании. На самом деле, она прямо-таки очень проста, особенно это заметно в сравнении с некоторыми другими серверными платформами.

▍JavaScript

В среде Node.js выполняется код, написанный на JavaScript. Это означает, что миллионы фронтенд-разработчиков, которые уже пользуются JavaScript в браузере, могут писать и серверный, и клиентский код на одном и том же языке программирования без необходимости изучать совершенно новый инструмент для перехода к серверной разработке.

В браузере и на сервере используются одинаковые концепции языка. Кроме того, в Node.js можно оперативно переходить на использование новых стандартов ECMAScript по мере их реализации на платформе. Для этого не нужно ждать до тех пор, пока пользователи обновят браузеры, так как Node.js — это серверная среда, которую полностью контролирует разработчик. В результате новые возможности языка оказываются доступными при установке поддерживающей их версии Node.js.

▍Движок V8

В основе Node.js, помимо других решений, лежит опенсорсный JavaScript-движок V8 от Google, применяемый в браузере Google Chrome и в других браузерах. Это означает, что Node.js пользуется наработками тысяч инженеров, которые сделали среду выполнения JavaScript Chrome невероятно быстрой и продолжают работать в направлении совершенствования V8.

▍Асинхронность

В традиционных языках программирования (C, Java, Python, PHP) все инструкции, по умолчанию, являются блокирующими, если только разработчик явным образом не позаботится об асинхронном выполнении кода. В результате если, например, в такой среде, произвести сетевой запрос для загрузки некоего JSON-кода, выполнение потока, из которого сделан запрос, будет приостановлено до тех пор, пока не завершится получение и обработка ответа.

JavaScript значительно упрощает написание асинхронного и неблокирующего кода с использованием единственного потока, функций обратного вызова (коллбэков) и подхода к разработке, основанной на событиях. Каждый раз, когда нам нужно выполнить тяжёлую операцию, мы передаём соответствующему механизму коллбэк, который будет вызван сразу после завершения этой операции. В результате, для того чтобы программа продолжила работу, ждать результатов выполнения подобных операций не нужно.

Подобный механизм возник в браузерах. Мы не можем позволить себе ждать, скажем, окончания выполнения AJAX-запроса, не имея при этом возможности реагировать на действия пользователя, например, на щелчки по кнопкам. Для того чтобы пользователям было удобно работать с веб-страницами, всё, и загрузка данных из сети, и обработка нажатия на кнопки, должно происходить одновременно, в режиме реального времени.

Если вы создавали когда-нибудь обработчик события нажатия на кнопку, то вы уже пользовались методиками асинхронного программирования.

Асинхронные механизмы позволяют единственному Node.js-серверу одновременно обрабатывать тысячи подключений, не нагружая при этом программиста задачами по управлению потоками и по организации параллельного выполнения кода. Подобные вещи часто являются источниками ошибок.

Node.js предоставляет разработчику неблокирующие базовые механизмы ввода вывода, и, в целом, библиотеки, использующиеся в среде Node.js, написаны с использованием неблокирующих парадигм. Это делает блокирующее поведение кода скорее исключением, чем нормой.

Когда Node.js нужно выполнить операцию ввода-вывода, вроде загрузки данных из сети, доступа к базе данных или к файловой системе, вместо того, чтобы заблокировать ожиданием результатов такой операции главный поток, Node.js инициирует её выполнение и продолжает заниматься другими делами до тех пор, пока результаты выполнения этой операции не будут получены.

▍Библиотеки

Благодаря простоте и удобству работы с менеджером пакетов для Node.js, который называется npm, экосистема Node.js прямо-таки процветает. Сейчас в реестре npm имеется более полумиллиона опенсорсных пакетов, которые может свободно использовать любой Node.js-разработчик.
Рассмотрев некоторые основные особенности платформы Node.js, опробуем её в действии. Начнём с установки.

Установка Node.js

Node.js можно устанавливать различными способами, которые мы сейчас рассмотрим.
Так, официальные установочные пакеты для всех основных платформ можно найти здесь.

Существует ещё один весьма удобный способ установки Node.js, который заключается в использовании менеджера пакетов, имеющегося в операционной системе. Например, менеджер пакетов macOS, который является фактическим стандартом в этой области, называется Homebrew. Если он в вашей системе есть, вы можете установить Node.js, выполнив эту команду в командной строке:

Список менеджеров пакетов для других операционных систем, в том числе — для Linux и Windows, можно найти здесь.

Популярным менеджером версий Node.js является nvm. Это средство позволяет удобно переключаться между различными версиями Node.js, с его помощью можно, например, установить и попробовать новую версию Node.js, после чего, при необходимости, вернуться на старую. Nvm пригодится и в ситуации, когда нужно испытать какой-нибудь код на старой версии Node.js.

Я посоветовал бы начинающим пользоваться официальными установщиками Node.js. Пользователям macOS я порекомендовал бы устанавливать Node.js с помощью Homebrew. Теперь, после того, как вы установили Node.js, пришло время написать «Hello World».

Первое Node.js-приложение

Самым распространённым примером первого приложения для Node.js можно назвать простой веб-сервер. Вот его код:

Для того чтобы запустить этот код, сохраните его в файле server.js и выполните в терминале такую команду:

Для проверки сервера откройте какой-нибудь браузер и введите в адресной строке http://127.0.0.1:3000 , то есть — тот адрес сервера, который будет выведен в консоли после его успешного запуска. Если всё работает как надо — на странице будет выведено «Hello World».

Разберём этот пример.

Для начала, обратите внимание на то, что код содержит команду подключения модуля http.

Платформа Node.js является обладателем замечательного стандартного набора модулей, в который входят отлично проработанные механизмы для работы с сетью.

Метод createServer() объекта http создаёт новый HTTP-сервер и возвращает его.

Сервер настроен на прослушивание определённого порта на заданном хосте. Когда сервер будет готов, вызывается соответствующий коллбэк, сообщающий нам о том, что сервер работает.

Когда сервер получает запрос, вызывается событие request , предоставляющее два объекта. Первый — это запрос ( req , объект http.IncomingMessage), второй — ответ ( res , объект http.ServerResponse). Они представляют собой важнейшие механизмы обработки HTTP-запросов.

Первый предоставляет в наше распоряжение сведения о запросе. В нашем простом примере этими данными мы не пользуемся, но, при необходимости, с помощью объекта req можно получить доступ к заголовкам запроса и к переданным в нём данным.

Второй нужен для формирования и отправки ответа на запрос.

В данном случае ответ на запрос мы формируем следующим образом. Сначала устанавливаем свойство statusCode в значение 200 , что указывает на успешное выполнение операции:

Далее, мы устанавливаем заголовок Content-Type :

После этого мы завершаем подготовку ответа, добавляя его содержимое в качестве аргумента метода end() :

Мы уже говорили о том, что вокруг платформы Node.js сформировалась мощная экосистема. Обсудим теперь некоторые популярные фреймворки и вспомогательные инструменты для Node.js.

Фреймворки и вспомогательные инструменты для Node.js

Node.js — это низкоуровневая платформа. Для того чтобы упростить разработку для неё и облегчить жизнь программистам, было создано огромное количество библиотек. Некоторые из них со временем стали весьма популярными. Вот небольшой список библиотек, которые я считаю отлично сделанными и достойными изучения:

    . Эта библиотека предоставляет разработчику предельно простой, но мощный инструмент для создания веб-серверов. Ключом к успеху Express стал минималистический подход и ориентация на базовые серверные механизмы без попытки навязать некое видение «единственно правильной» серверной архитектуры. . Это — мощный фулстек-фреймворк, реализующий изоморфный подход к разработке приложений на JavaScript и к использованию кода и на клиенте, и на сервере. Когда-то Meteor представлял собой самостоятельный инструмент, включающий в себя всё, что только может понадобиться разработчику. Теперь он, кроме того, интегрирован с фронтенд-библиотеками, такими, как React, Vue и Angular. Meteor, помимо разработки обычных веб-приложений, можно использовать и в мобильной разработке. . Этот веб-фреймворк создан той же командой, которая занимается работой над Express. При его разработке, в основу которой легли годы опыта работы над Express, внимание уделялось простоте решения и его компактности. Этот проект появился как решение задачи внесения в Express серьёзных изменений, несовместимых с другими механизмами фреймворка, которые могли бы расколоть сообщество. . Этот фреймворк предназначен для организации серверного рендеринга React-приложений. . Это — весьма компактная библиотека для создания асинхронных HTTP-микросервисов. . Это библиотека для разработки сетевых приложений реального времени.

Краткая история Node.js

В этом году Node.js исполнилось уже 9 лет. Это, конечно, не так уж и много, если сравнить этот возраст с возрастом JavaScript, которому уже 23 года, или с 25-летним возрастом веба, существующем в таком виде, в котором мы его знаем, если считать от появления браузера Mosaic.

9 лет — это маленький срок для технологии, но сейчас возникает такое ощущение, что платформа Node.js существовала всегда.

Я начал работу с Node.js с ранних версий платформы, когда ей было ещё только 2 года. Даже тогда, несмотря на то, что информации о Node.js было не так уж и много, уже можно было почувствовать, что Node.js — это очень серьёзно.

Теперь поговорим о технологиях, лежащих в основе Node.js и кратко рассмотрим основные события, связанные с этой платформой.

Итак, JavaScript — это язык программирования, который был создан в Netscape как скриптовый язык, предназначенный для управления веб-страницами в браузере Netscape Navigator.

Executing code from a file

Running code files located within the same directory as your CMD home directory

If you have a script called “myscript.js” which is located within your C:/Users/<user name> directory, you will run the command:

As you can see from the above commands, including the extension does not matter. However, this rule is only applicable if myscript is the JavaScript file, not a directory

Running Code from a file from a directory that is not the same as your CMD home directory

To run from parent directory

To run from other directory relative to CMD home directory

To run file myscript located in C:/Users/<User name>/myfolder

To run from an entirely different directory

Let’s say you want to run myscript.js from E:/nodejs/

In the next article, we will dive deeper into the Node.JS engine to write scripts through utilization of modules and exports.

All of the commands listed above are the ways you can run NodeJS scripts directly from the command line. Thank you so much for reading!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *