From 0f50dec9d2e091788e61ef83ac7e6b2255d5876b Mon Sep 17 00:00:00 2001 From: Lizaveta Date: Sat, 18 Nov 2023 07:19:30 +0200 Subject: [PATCH] refactor: update files to maintain consistent text style, update irrelevant links --- .../node/images/stream-schema.png | Bin 0 -> 55754 bytes .../modules/node-materials/node/module/fs.md | 10 ++-- .../node-materials/node/module/http.md | 14 ++--- .../node-materials/node/module/npm-module.md | 2 +- .../node-materials/node/module/path.md | 50 ++++++++++-------- .../modules/node-materials/node/node-argv.md | 10 ++-- .../node-materials/node/node-fs-access.md | 2 +- .../node-materials/node/node-introduction.md | 4 +- .../node-materials/node/node-module.md | 7 +-- .../modules/node-materials/node/node-stdio.md | 2 +- .../node/projects/github-app.md | 21 +++++--- .../node-materials/node/projects/notes.md | 17 +++--- .../node-materials/node/projects/timer.md | 3 +- .../node-materials/node/stream-readable.md | 3 -- stage1/modules/node-materials/node/stream.md | 2 +- 15 files changed, 77 insertions(+), 70 deletions(-) create mode 100644 stage1/modules/node-materials/node/images/stream-schema.png diff --git a/stage1/modules/node-materials/node/images/stream-schema.png b/stage1/modules/node-materials/node/images/stream-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e3486b1c8967aa797ca26758e5ee65ad1f2f88 GIT binary patch literal 55754 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 m1>W%Be;vWy4q@fyZjNyN*YA { if (err) throw err; console.log("File was created"); - } + }, ); ``` @@ -57,7 +57,7 @@ fs.appendFile( (err) => { if (err) throw err; console.log("File was modified"); - } + }, ); ``` @@ -73,7 +73,7 @@ fs.readFile( (err, data) => { if (err) throw err; console.log(data); - } + }, ); ``` @@ -89,10 +89,10 @@ fs.rename( (err) => { if (err) throw err; console.log("File renamed"); - } + }, ); ``` ### Project -[Note-taking Application](../projects/notes.md) +[Notes App](../projects/notes.md) diff --git a/stage1/modules/node-materials/node/module/http.md b/stage1/modules/node-materials/node/module/http.md index 447c797a0..6dc5af9e4 100644 --- a/stage1/modules/node-materials/node/module/http.md +++ b/stage1/modules/node-materials/node/module/http.md @@ -48,9 +48,11 @@ This method takes a callback function `requestHandler` with two parameters, `req - `request` holds information about the request - `response` is responsible for sending the response -Our `requestHandler` logs the request method and the address of the requested resource to the console. It also sends the messages `Hello from Node.js` and `Bye!` as responses. -The `response.write()` method writes the message to the response body, and `response.end()` informs the server that the headers and body of the response are written and it can be sent. -Note that `response.end()` should terminate every response. Without it, the request processing will "hang" — the request will be received but not fully processed. +Our `requestHandler` logs the request method and the address of the requested resource to the console. It also sends the messages `Hello from Node.js` and `Bye!` as responses. + +The `response.write()` method writes the message to the response body, and `response.end()` informs the server that the headers and body of the response are written and it can be sent. + +Note that `response.end()` should terminate every response. Without it, the request processing will "hang" — the request will be received but not fully processed: ```js const requestHandler = (request, response) => { @@ -61,7 +63,7 @@ const requestHandler = (request, response) => { }; ``` -The server's `listen` method starts it, and it begins to listen on the specified port for connections. It has multiple signatures; in our case, it takes three parameters: the local port, the local address, and a callback function that runs when it starts listening for connections. +The server's `listen` method starts it, and it begins to listen on the specified port for connections. It has multiple signatures; in our case, it takes three parameters: the local port, the local address, and a callback function that runs when it starts listening for connections: ```js server.listen(PORT, "localhost", () => { @@ -72,7 +74,7 @@ server.listen(PORT, "localhost", () => { Run the file with the code, open your browser, and go to the address `localhost:3000/some/page`. Note that to run the server with different code, you need to stop it and restart it. You already know how to terminate a Node.js process. Only one server can be running on a port at a time. -In the `write` and `end` methods, you can pass a string containing HTML tags with inline styles. These tags will be correctly processed by the browser. +In the `write` and `end` methods, you can pass a string containing HTML tags with inline styles. These tags will be correctly processed by the browser: ```js const http = require("http"); @@ -99,4 +101,4 @@ By revisiting the page `localhost:3000/some/page`, you will see the rendered mar ## Project -[Github Application](../projects/github-app.md) +[Github App](../projects/github-app.md) diff --git a/stage1/modules/node-materials/node/module/npm-module.md b/stage1/modules/node-materials/node/module/npm-module.md index ac6b89da0..8e443e182 100644 --- a/stage1/modules/node-materials/node/module/npm-module.md +++ b/stage1/modules/node-materials/node/module/npm-module.md @@ -4,7 +4,7 @@ Let's install the `colors` module using `npm`. In the terminal, execute the command: -```powershell +```bash npm install colors ``` diff --git a/stage1/modules/node-materials/node/module/path.md b/stage1/modules/node-materials/node/module/path.md index d29a39181..35aafb895 100644 --- a/stage1/modules/node-materials/node/module/path.md +++ b/stage1/modules/node-materials/node/module/path.md @@ -14,25 +14,31 @@ You can find the information about the properties and methods of `path` in the [ Let's look at some of them: -- Retrieving file data - ```js - // for a file located at C:\Users\Admin\Desktop\nodejs-basic\index.js - const path = require("path"); - console.log(path.basename(__filename)); // index.js - file name on Windows, full file path on POSIX systems - console.log(path.dirname(__filename)); // C:\Users\Admin\Desktop\nodejs-basic - folder name - console.log(path.extname(__filename)); // .js - file extension - console.log(path.parse(__filename)); // returns an object specifying the disk root, folder name, file name, file extension, file name without extension - ``` -- Concatenating paths - ```js - // for a file located at C:\Users\Admin\Desktop\nodejs-basic\index.js - const path = require("path"); - // returns C:\Users\Admin\Desktop\nodejs-basic\test\second.html - console.log(path.join(__dirname, "test", "second.html")); - ``` - `path.join()` concatenates the specified path segments together, using the separator for the specific platform (forward slash `/` for Linux, backslash `\` for Windows). The result is a relative path. - ```js - const path = require("path"); - console.log(path.resolve(__dirname, "./test", "/second.html")); - ``` - `path.resolve()` converts a sequence of paths or path segments into an absolute path from right to left and normalizes it: if some path segments have slashes while others don't, it will still generate the correct path. +**Retrieving file data** + +```js +// for a file located at C:\Users\Admin\Desktop\nodejs-basic\index.js +const path = require("path"); +console.log(path.basename(__filename)); // index.js - file name on Windows, full file path on POSIX systems +console.log(path.dirname(__filename)); // C:\Users\Admin\Desktop\nodejs-basic - folder name +console.log(path.extname(__filename)); // .js - file extension +console.log(path.parse(__filename)); // returns an object specifying the disk root, folder name, file name, file extension, file name without extension +``` + +**Concatenating paths** + +```js +// for a file located at C:\Users\Admin\Desktop\nodejs-basic\index.js +const path = require("path"); +// returns C:\Users\Admin\Desktop\nodejs-basic\test\second.html +console.log(path.join(__dirname, "test", "second.html")); +``` + +`path.join()` concatenates the specified path segments together, using the separator for the specific platform (forward slash `/` for Linux, backslash `\` for Windows). The result is a relative path: + +```js +const path = require("path"); +console.log(path.resolve(__dirname, "./test", "/second.html")); +``` + +`path.resolve()` converts a sequence of paths or path segments into an absolute path from right to left and normalizes it: if some path segments have slashes while others don't, it will still generate the correct path. diff --git a/stage1/modules/node-materials/node/node-argv.md b/stage1/modules/node-materials/node/node-argv.md index d0c243041..c98a5a0b9 100644 --- a/stage1/modules/node-materials/node/node-argv.md +++ b/stage1/modules/node-materials/node/node-argv.md @@ -32,7 +32,7 @@ The `process.argv.slice(2)` method returns a new array that starts from the elem To have the ability to send arguments in any order or skip some of them, you can mark command line arguments. For this purpose, flags are used. Flags are words or symbols indicating that a command line argument follows them. Flags are usually preceded by one or two dashes to avoid confusion with arguments. For example: -```powershell +```bash node test -m Hello ``` @@ -80,7 +80,7 @@ obj.sayHi(); with the option `--disable-proto=throw`: -```powershell +```bash node --disable-proto=throw test ``` @@ -119,14 +119,14 @@ if (productionMode) { Write a program that prompts the user to enter two numbers, adds these numbers if launched with the `-s` flag, or multiplies them if launched with the `-m` flag, and then terminates. Use standard input/output for input and output. Here is an example of how it should work (user input starts with `>`): -```powershell +```bash > node test.js -m Enter 2 numbers > 2 7 2 * 7 = 14 ``` -```powershell +```bash > node test.js -s Enter 2 numbers > 2 7 @@ -150,7 +150,7 @@ stdin.on("data", (data) => { const numStringsArray = numString.split(" "); const hasIncorrectLength = numStringsArray.length !== 2; const hasIncorrectValues = numStringsArray.some((numStr) => - Number.isNaN(+numStr) + Number.isNaN(+numStr), ); if (hasIncorrectLength || hasIncorrectValues) { stdout.write("You need to enter 2 numbers separated by a space"); diff --git a/stage1/modules/node-materials/node/node-fs-access.md b/stage1/modules/node-materials/node/node-fs-access.md index 17d89df0d..fb487d189 100644 --- a/stage1/modules/node-materials/node/node-fs-access.md +++ b/stage1/modules/node-materials/node/node-fs-access.md @@ -11,7 +11,7 @@ console.log(__dirname); Open the terminal and run the file: -```powershell +```bash node test ``` diff --git a/stage1/modules/node-materials/node/node-introduction.md b/stage1/modules/node-materials/node/node-introduction.md index 4a3954ee8..9f4d8a263 100644 --- a/stage1/modules/node-materials/node/node-introduction.md +++ b/stage1/modules/node-materials/node/node-introduction.md @@ -4,7 +4,7 @@ ### Installing Node.js -Download link https://nodejs.org/en +Download link: https://nodejs.org/en Download and install the latest LTS version (Recommended For Most Users) @@ -54,7 +54,7 @@ console.log("Hello, world!"); Open this file with VS Code, in the terminal execute the command: -```powershell +```bash node test.js ``` diff --git a/stage1/modules/node-materials/node/node-module.md b/stage1/modules/node-materials/node/node-module.md index a01e99699..a0686d9aa 100644 --- a/stage1/modules/node-materials/node/node-module.md +++ b/stage1/modules/node-materials/node/node-module.md @@ -51,7 +51,7 @@ Packages are convenient to work with using package managers such as `npm` or `ya To install a package using `npm`, use the command: -```powershell +```bash npm install ``` @@ -76,7 +76,7 @@ A `package.json` file is created in the project folder, describing the created a ### Installing Packages via npm -To install a module, use the command +To install a module, use the command: ```bash npm install @@ -94,7 +94,8 @@ Removing a module: npm uninstall nodemon ``` -Installed modules are added to the `node_modules` folder, and information about them is added to the `package.json` file. Additionally, a `package-lock.json` file is automatically created, ensuring package identity among different users and performing other useful functions. +Installed modules are added to the `node_modules` folder, and information about them is added to the `package.json` file. +Additionally, a `package-lock.json` file is automatically created, ensuring package identity among different users and performing other useful functions. If you delete the `node_modules` folder and execute the `npm install` command, the `node_modules` folder will be restored along with all the added modules based on the records in the `package.json` file. diff --git a/stage1/modules/node-materials/node/node-stdio.md b/stage1/modules/node-materials/node/node-stdio.md index 474cb5f14..fc5aa7f0b 100644 --- a/stage1/modules/node-materials/node/node-stdio.md +++ b/stage1/modules/node-materials/node/node-stdio.md @@ -96,7 +96,7 @@ stdin.on("data", (data) => { }); ``` -If we log the type of the `data` variable to the console, we will see `object`. By applying the [trick with the special `[[Class]]` property](https://learn.javascript.ru/class-instanceof#sekretnoe-svoystvo-class), we get `[object Uint8Array]` for `data`. +If we log the type of the `data` variable to the console, we will see `object`. By applying the [trick with the toString() method](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString#using_tostring_to_detect_object_class), we get `[object Uint8Array]` for `data`. Since `process.stdin` is a stream, it works with data in **binary** format. To handle such data in Node.js, there is a special `Buffer` object, which is a subclass of `Uint8Array` (a typed array storing 8-bit unsigned integer values). The data contained in the `Buffer` can be converted to a string: diff --git a/stage1/modules/node-materials/node/projects/github-app.md b/stage1/modules/node-materials/node/projects/github-app.md index 805bbbb90..0886df309 100644 --- a/stage1/modules/node-materials/node/projects/github-app.md +++ b/stage1/modules/node-materials/node/projects/github-app.md @@ -8,7 +8,7 @@ To achieve this, we'll use the GitHub API. The request `https://api.github.com/u 1. Start by creating a new Node.js application -Create a folder named github-app, open it in VS Code, and run the following command in the terminal: +Create a folder named `github-app`, open it in VS Code, and run the following command in the terminal: ``` npm init -y @@ -35,6 +35,7 @@ const username = process.argv[2]; Use the imported `github` object, which has a `getRepos()` property - a function that returns a list of user repositories. The parameters of the `getRepos()` function are `username` - the username and a callback function taking two parameters: `error` - an error, and `repos` - the received data, in our case, a list of repositories. + In the callback function, let's handle the error and print the names of the repositories to the console: ```js @@ -49,11 +50,11 @@ github.getRepos(username, (error, repos) => { Our application will communicate with the server over the `https` protocol. For this, Node.js has a built-in `https module`, similar to the [HTTP Module](../module/http.md). -To send a request to the API, we'll use the `get()` method, which allows us to retrieve data from the server. +To send a request to the API, we'll use the `get()` method, which allows us to retrieve data from the server. Import the `https` module and write the code for the `getRepos()` function. The function parameter is `username` - the GitHub username. The `https.get()` method has two parameters: the URL to which the request is sent and a callback function taking one parameter - the server response, abbreviated as `res`. -The `res.statusCode` property returns the server response. A response of `200` indicates a successful connection, while any other response indicates a connection problem. +The `res.statusCode` property returns the server response. A response of `200` indicates a successful connection, while any other response indicates a connection problem. Export the `github` module as an object with a `getRepos` property and the value of `getRepos`: ```js @@ -94,7 +95,8 @@ Use the `option` object as the first parameter in `the https.get` method. The ap 4. Handling incoming data -Almost everything in Node.js, including communication with the server, is implemented asynchronously, using events and streams. Information from the server comes in parts. +Almost everything in Node.js, including communication with the server, is implemented asynchronously, using events and streams. Information from the server comes in parts. + The server response (`res`) has a `data` event, which fires when a part of the requested information comes from the server. Subscribe to this event and print the received data to the console: ```js @@ -133,7 +135,8 @@ function getRepos(username) { } ``` -The response (`res`) method has an `end` event, which triggers when the data transmission is complete. +The response (`res`) method has an `end` event, which triggers when the data transmission is complete. + Upon the occurrence of this event, use the `JSON.parse(body)` method to convert the received data into an array: ```js @@ -186,6 +189,8 @@ function getRepos(username, done) { 6. Error Handling +When working with the application, errors may occur in the following cases: + - The application is launched without a username - An error occurs when sending a request if a nonexistent username is specified - An error occurs when receiving a response from the server @@ -199,7 +204,7 @@ Handle errors in the `github` module and pass them to the `app` module, specifyi if (!username) return done(new Error("Username is required")); ``` -2. Request error - the `error` event of the `request` method. +2. Request error - the `error` event of the `request` method Create a variable `request` and set its value to the `https.get()` method: @@ -253,8 +258,8 @@ function getRepos(username, done) { } else { done( new Error( - `Error working with the server ${res.statusCode} ${res.statusMessage}` - ) + `Error working with the server ${res.statusCode} ${res.statusMessage}`, + ), ); } }); diff --git a/stage1/modules/node-materials/node/projects/notes.md b/stage1/modules/node-materials/node/projects/notes.md index b57ecc7a7..dc1fbf027 100644 --- a/stage1/modules/node-materials/node/projects/notes.md +++ b/stage1/modules/node-materials/node/projects/notes.md @@ -2,17 +2,17 @@ [HOME](../../README.md) -Let's write a simple console application called Notes for working with notes. The application needs to implement four methods: +Let's write a simple console application called Notes for working with notes. The application needs to implement 4 methods: - `create` - `list` - `view` - `remove` -The `create` method creates a new note in the notes.json file. The `create` method has two arguments: the note's title and its content. -The `list` method displays a list of notes. -The `view` method outputs the content of a note whose title is passed as an argument. -The `remove` method deletes a note whose title is passed as an argument. +1. The `create` method creates a new note in the notes.json file. The `create` method has two arguments: the note's title and its content. +2. The `list` method displays a list of notes. +3. The `view` method outputs the content of a note whose title is passed as an argument. +4. The `remove` method deletes a note whose title is passed as an argument. To call these methods, they are specified as command-line arguments. @@ -66,11 +66,6 @@ The function works, but it doesn't add data; instead, it replaces them. So, we need to: -- прочитать уже имеющиеся данные из файла `'notes.json'` при помощи метода `fs.readFile()` -- преобразовать полученные данные в массив при помощи метода `JSON.parse()` -- дополнить массив новыми данными при помощи метода `.push()` -- преобразовать массив в JSON при помощи метода `JSON.stringify()` -- записать данные в файл `'notes.json'` при помощи метода `fs.writeFile()` - Read the existing data from the `notes.json` file using the `fs.readFile()` method - Convert the received data into an array using the `JSON.parse()` method - Add new data to the array using the `.push()` method @@ -95,7 +90,7 @@ function create(title, content) { Run the file with the command: -```powershell +```bash node index create title content ``` diff --git a/stage1/modules/node-materials/node/projects/timer.md b/stage1/modules/node-materials/node/projects/timer.md index 6abdc31c3..90ec206f8 100644 --- a/stage1/modules/node-materials/node/projects/timer.md +++ b/stage1/modules/node-materials/node/projects/timer.md @@ -2,8 +2,9 @@ [HOME](../../README.md) -Directly creating objects based on the `EventEmitter` class is extremely rare. +Directly creating objects based on the `EventEmitter` class is extremely rare. More often, the interface for working with events is added to other objects. This is done through inheritance. + Let's create a class called `Timer` that will inherit from `EventEmitter`, and, as a result, its instances will have the `emit()` and `on()` methods: ```js diff --git a/stage1/modules/node-materials/node/stream-readable.md b/stage1/modules/node-materials/node/stream-readable.md index ec31489ec..6cd5094ea 100644 --- a/stage1/modules/node-materials/node/stream-readable.md +++ b/stage1/modules/node-materials/node/stream-readable.md @@ -44,9 +44,6 @@ let data = ""; stream.on("data", (chunk) => (data += chunk)); ``` -Так как мы имеем дело с потоком данных, нам нужно знать когда поток завершится. Для этого у стрима есть событие `'end'`. Это событие срабатывает когда все данные уже переданы. -При наступлении события `'end'` выведем в консоль сообщение и длину полученных данных: - Since we are dealing with a data stream, we need to know when the stream will end. For this, the stream has an `end` event. This event is triggered when all the data has already been passed. When the `end` event occurs, we'll output a message to the console and the length of the received data: diff --git a/stage1/modules/node-materials/node/stream.md b/stage1/modules/node-materials/node/stream.md index 30eb38875..d366ea34e 100644 --- a/stage1/modules/node-materials/node/stream.md +++ b/stage1/modules/node-materials/node/stream.md @@ -2,7 +2,7 @@ [HOME](../README.md) -![stream schema](https://pawelgrzybek.com/photos/2020-07-14-1.png) +![stream schema](images/stream-schema.png) When working with a significant amount of data, processing it all at once can lead to loading the entire dataset into memory and freezing the program for the entire duration of the operation.