An open API service indexing awesome lists of open source software.

https://github.com/viktorsvertoka/goit-node-hw-01

Node.js HomeworkπŸ“—
https://github.com/viktorsvertoka/goit-node-hw-01

gitignore goit goit-node-hw-01 json node node-js nodejs npm prettier

Last synced: 3 months ago
JSON representation

Node.js HomeworkπŸ“—

Awesome Lists containing this project

README

          

# Π”ΠΎΠΌΠ°ΡˆΠ½Ρ” завдання 1

## ΠšΡ€ΠΎΠΊ 1

- Π†Π½Ρ–Ρ†Ρ–Π°Π»Ρ–Π·ΡƒΡ”Ρ‚ΡŒΡΡ npm Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ–
- Π’ ΠΊΠΎΡ€Π΅Π½Ρ– ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ створи Ρ„Π°ΠΉΠ» `index.js`
- ΠŸΠΎΡΡ‚Π°Π² ΠΏΠ°ΠΊΠ΅Ρ‚ [nodemon](https://www.npmjs.com/package/nodemon) як Π·Π°Π»Π΅ΠΆΠ½Ρ–ΡΡ‚ΡŒ
[nodemon](https://www.npmjs.com/package/nodemon) як Π·Π°Π»Π΅ΠΆΠ½Ρ–ΡΡ‚ΡŒ Ρ€ΠΎΠ·Ρ€ΠΎΠ±ΠΊΠΈ
(devDependencies)
- Π’ Ρ„Π°ΠΉΠ»Ρ– `package.json` Π΄ΠΎΠ΄Π°ΠΉ "скрипти" для запуску `index.js`
- Π‘ΠΊΡ€ΠΈΠΏΡ‚ `start` який запускає `index.js` Π·Π° допомогою `node`
- Π‘ΠΊΡ€ΠΈΠΏΡ‚ `dev` який запускає `index.js` Π·Π° допомогою `nodemon`

## ΠšΡ€ΠΎΠΊ 2

Π£ ΠΊΠΎΡ€Π΅Π½Ρ– ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ створи ΠΏΠ°ΠΏΠΊΡƒ `db`. Для збСрігання ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ–Π² Π·Π°Π²Π°Π½Ρ‚Π°ΠΆ Ρ–
використовуй Ρ„Π°ΠΉΠ» [contacts.json](./contacts.json), поклавши ΠΉΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΏΠΊΡƒ `db`.

Π£ ΠΊΠΎΡ€Π΅Π½Ρ– ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ створи Ρ„Π°ΠΉΠ» `contacts.js`.

- Π—Ρ€ΠΎΠ±ΠΈ Ρ–ΠΌΠΏΠΎΡ€Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»Ρ–Π² `fs` (Ρƒ вСрсії, яка ΠΏΡ€Π°Ρ†ΡŽΡ” Π· промісами - `fs/promises`) Ρ–
`path` для Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠΎΡŽ
- Π‘Ρ‚Π²ΠΎΡ€ΠΈ Π·ΠΌΡ–Π½Π½Ρƒ `contactsPath` Ρ– запиши Π² Π½Π΅Ρ— ΡˆΠ»ΡΡ… Π΄ΠΎ Ρ„Π°ΠΉΠ»Ρ– `contacts.json`. Для
складання ΡˆΠ»ΡΡ…Ρƒ використовуй ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ модуля `path`.
- Π”ΠΎΠ΄Π°ΠΉ Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ— для Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π· ΠΊΠΎΠ»Π΅ΠΊΡ†Ρ–Ρ”ΡŽ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ–Π². Π£ функціях використовуй ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
`fs` Ρ‚Π° ΠΉΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ `readFile()` Ρ– `writeFile()`
- Π—Ρ€ΠΎΠ±ΠΈ Скспорт створСних Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΠΉ Ρ‡Π΅Ρ€Π΅Π· `module.exports`

```js
// contacts.js

/*
* Π ΠΎΠ·ΠΊΠΎΠΌΠ΅Π½Ρ‚ΡƒΠΉΡ‚Π΅ Ρ– Π·Π°ΠΏΠΈΡˆΠΈΡ‚ΡŒ значСння
* const contactsPath = ;
*/

// TODO: Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΡƒΠ²Π°Ρ‚ΠΈ ΠΊΠΎΠΆΠ½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΡŽ
function listContacts() {
// ...Ρ‚Π²Ρ–ΠΉ ΠΊΠΎΠ΄. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” масив ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ–Π².
}

function getContactById(contactId) {
// ...Ρ‚Π²Ρ–ΠΉ ΠΊΠΎΠ΄. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” ΠΎΠ±'Ρ”ΠΊΡ‚ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ Π· Ρ‚Π°ΠΊΠΈΠΌ id. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” null, якщо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ Π· Ρ‚Π°ΠΊΠΈΠΌ id Π½Π΅ Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΈΠΉ.
}

function removeContact(contactId) {
// ...Ρ‚Π²Ρ–ΠΉ ΠΊΠΎΠ΄. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” ΠΎΠ±'Ρ”ΠΊΡ‚ Π²ΠΈΠ΄Π°Π»Π΅Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” null, якщо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ Π· Ρ‚Π°ΠΊΠΈΠΌ id Π½Π΅ Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΈΠΉ.
}

function addContact(name, email, phone) {
// ...Ρ‚Π²Ρ–ΠΉ ΠΊΠΎΠ΄. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” ΠΎΠ±'Ρ”ΠΊΡ‚ Π΄ΠΎΠ΄Π°Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ. ΠŸΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” null, якщо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ Π· Ρ‚Π°ΠΊΠΈΠΌ id Π½Π΅ Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΈΠΉ.
}
```

## ΠšΡ€ΠΎΠΊ 3

Π—Ρ€ΠΎΠ±ΠΈ Ρ–ΠΌΠΏΠΎΡ€Ρ‚ модуля `contacts.js` Π² Ρ„Π°ΠΉΠ»Ρ– `index.js` Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π²Ρ–Ρ€ ΠΏΡ€Π°Ρ†Π΅Π·Π΄Π°Ρ‚Π½Ρ–ΡΡ‚ΡŒ
Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΠΉ для Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π· ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°ΠΌΠΈ.

## ΠšΡ€ΠΎΠΊ 4

Π£ Ρ„Π°ΠΉΠ»Ρ– `index.js` Ρ–ΠΌΠΏΠΎΡ€Ρ‚ΡƒΡ”Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ `yargs` для Π·Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ парсу Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ–Π²
ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ рядка. Використовуй Π³ΠΎΡ‚ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΡŽ `invokeAction()` яка ΠΎΡ‚Ρ€ΠΈΠΌΡƒΡ” Ρ‚ΠΈΠΏ
Π²ΠΈΠΊΠΎΠ½ΡƒΠ²Π°Π½ΠΎΡ— Π΄Ρ–Ρ— Ρ– Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Ρ– Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ. Ѐункція Π²ΠΈΠΊΠ»ΠΈΠΊΠ°Ρ” Π²Ρ–Π΄ΠΏΠΎΠ²Ρ–Π΄Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·
Ρ„Π°ΠΉΠ»Ρƒ `contacts.js` ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‡ΠΈ ΠΉΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Ρ– Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ.

```js
// index.js
const argv = require('yargs').argv;

// TODO: Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ
function invokeAction({ action, id, name, email, phone }) {
switch (action) {
case 'list':
// ...
break;

case 'get':
// ... id
break;

case 'add':
// ... name email phone
break;

case 'remove':
// ... id
break;

default:
console.warn('\x1B[31m Unknown action type!');
}
}

invokeAction(argv);
```

Π’Π°ΠΊ само, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ використовувати ΠΌΠΎΠ΄ΡƒΠ»ΡŒ [commander]
(https://www.npmjs.com/package/commander) для парсинга Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ–Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ
рядка. Π¦Π΅ Π±Ρ–Π»ΡŒΡˆ популярна Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° модуля `yargs`

```js
const { Command } = require('commander');
const program = new Command();
program
.option('-a, --action ', 'choose action')
.option('-i, --id ', 'user id')
.option('-n, --name ', 'user name')
.option('-e, --email ', 'user email')
.option('-p, --phone ', 'user phone');

program.parse(process.argv);

const argv = program.opts();

// TODO: Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ
function invokeAction({ action, id, name, email, phone }) {
switch (action) {
case 'list':
// ...
break;

case 'get':
// ... id
break;

case 'add':
// ... name email phone
break;

case 'remove':
// ... id
break;

default:
console.warn('\x1B[31m Unknown action type!');
}
}

invokeAction(argv);
```

## ΠšΡ€ΠΎΠΊ 5

Запусти ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² Ρ‚Π΅Ρ€ΠΌΡ–Π½Π°Π»Ρ– Ρ– Π·Ρ€ΠΎΠ±ΠΈ ΠΎΠΊΡ€Π΅ΠΌΠΈΠΉ ΡΠΊΡ€Ρ–Π½ΡˆΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ виконання ΠΊΠΎΠΆΠ½ΠΎΡ—
ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.

```shell
# ΠžΡ‚Ρ€ΠΈΠΌΡƒΡ”ΠΌΠΎ Ρ– Π²ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎ вСсь список ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ–Π² Ρƒ вигляді Ρ‚Π°Π±Π»ΠΈΡ†Ρ– (console.table)
node index.js --action="list"

# ΠžΡ‚Ρ€ΠΈΠΌΡƒΡ”ΠΌΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ ΠΏΠΎ id Ρ– Π²ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎ Ρƒ консоль ΠΎΠ±'Ρ”ΠΊΡ‚ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π° Π°Π±ΠΎ null якщо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ Π· Ρ‚Π°ΠΊΠΈΠΌ id Π½Π΅ існує
node index.js --action="get" --id 05olLMgyVQdWRwgKfg5J6

# Π”ΠΎΠ΄Π°Ρ”ΠΌΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ Ρ‚Π° Π²ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎ Π² консоль ΠΎΠ±'Ρ”ΠΊΡ‚ новостворСного ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ
node index.js --action="add" --name Mango --email mango@gmail.com --phone 322-22-22

# Видаляємо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ Ρ‚Π° Π²ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎ Π² консоль ΠΎΠ±'Ρ”ΠΊΡ‚ Π²ΠΈΠ΄Π°Π»Π΅Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ Π°Π±ΠΎ null якщо ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ Π· Ρ‚Π°ΠΊΠΈΠΌ id Π½Π΅ існує
node index.js --action="remove" --id qdggE76Jtbfd9eWJHrssH
```

## ΠšΡ€ΠΎΠΊ 6 - Π—Π΄Π°Ρ‡Π° домашнього завдання.

Π‘ΠΊΡ€Ρ–Π½ΡˆΠΎΡ‚ΠΈ виконання ΠΊΠΎΠΌΠ°Π½Π΄, ΠΌΠΎΠΆΠ½Π° Π·Π°Π»ΠΈΡ‚ΠΈ Π½Π° Π±ΡƒΠ΄ΡŒ-який Π±Π΅Π·ΠΊΠΎΡˆΡ‚ΠΎΠ²Π½ΠΈΠΉ Ρ…ΠΌΠ°Ρ€Π½ΠΈΠΉ
сСрвіс збСрігання ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ (ΠŸΡ€ΠΈΠΊΠ»Π°Π΄: [monosnap](https://monosnap.com/),
[imgbb.com](https://imgbb.com/)) Ρ– Π²Ρ–Π΄ΠΏΠΎΠ²Ρ–Π΄Π½Ρ– посилання Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΎ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ Π² Ρ„Π°ΠΉΠ»
README.md. Π‘Ρ‚Π²ΠΎΡ€Ρ–Ρ‚ΡŒ Ρ†Π΅ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΡ€Π΅Π½Ρ– ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ. ΠŸΡ–ΡΠ»Ρ ΠΏΡ€ΠΈΠΊΡ€Ρ–ΠΏΡ–Ρ‚ΡŒ посилання Π½Π°
сховищС Π· Π΄ΠΎΠΌΠ°ΡˆΠ½Ρ–ΠΌ завданням Π² [schoology](https://app.schoology.com/login) для
ΠΏΠ΅Ρ€Π΅Π²Ρ–Ρ€ΠΊΠΈ ΠΌΠ΅Π½Ρ‚ΠΎΡ€ΠΎΠΌ. Π’Π°ΠΊΠΎΠΆ Ρƒ Ρ„Π°ΠΉΠ» README.md Ρ‚Ρ€Π΅Π±Π° Π΄ΠΎΠ΄Π°Ρ‚ΠΈ посилання Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Ρ–ΠΉ
Π·Ρ– Π·Ρ€ΠΎΠ±Π»Π΅Π½ΠΎΡŽ Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΡŽ.

## ΠšΡ€ΠΈΡ‚Π΅Ρ€Ρ–Ρ— ΠΏΡ€ΠΈΠΉΠΎΠΌΡƒ

- Π‘Ρ‚Π²ΠΎΡ€Π΅Π½ΠΎ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Ρ–ΠΉ Π· Π΄ΠΎΠΌΠ°ΡˆΠ½Ρ–ΠΌ завданням β€” CLI Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊ
- Завдання Π²Ρ–Π΄ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ ΠΌΠ΅Π½Ρ‚ΠΎΡ€ΠΎΠ²Ρ– Π² [schoology](https://app.schoology.com/login)
Π½Π° ΠΏΠ΅Ρ€Π΅Π²Ρ–Ρ€ΠΊΡƒ (посилання Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Ρ–ΠΉ)
- Код Π²Ρ–Π΄ΠΏΠΎΠ²Ρ–Π΄Π°Ρ” Ρ‚Π΅Ρ…Π½Ρ–Ρ‡Π½ΠΎΠΌΡƒ завданню ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ
- ΠŸΡ€ΠΈ Π²ΠΈΠΊΠΎΠ½Π°Π½Π½Ρ– ΠΊΠΎΠ΄Ρƒ Π½Π΅ Π²ΠΈΠ½ΠΈΠΊΠ°Ρ” Π½Π΅ΠΎΠ±Ρ€ΠΎΠ±Π»Π΅Π½ΠΈΡ… ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ
- Назва Π·ΠΌΡ–Π½Π½ΠΈΡ…, властивостСй Ρ– ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ–Π² ΠΏΠΎΡ‡ΠΈΠ½Π°Ρ”Ρ‚ΡŒΡΡ Π· ΠΌΠ°Π»ΠΎΡ— Π»Ρ–Ρ‚Π΅Ρ€ΠΈ Ρ– Π·Π°ΠΏΠΈΡΡƒΡŽΡ‚ΡŒΡΡ
Π² Π½ΠΎΡ‚Π°Ρ†Ρ–Ρ— CamelCase. Π’ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‚ΡŒΡΡ Π°Π½Π³Π»Ρ–ΠΉΡΡŒΠΊΡ– Ρ–ΠΌΠ΅Π½Π½ΠΈΠΊΠΈ
- Назва Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ— Π°Π±ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΌΡ–ΡΡ‚ΠΈΡ‚ΡŒ дієслово
- Π£ ΠΊΠΎΠ΄Ρ– Π½Π΅ΠΌΠ°Ρ” Π·Π°ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΡ… ділянок ΠΊΠΎΠ΄Ρƒ
- ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€Π°Ρ†ΡŽΡ” Π· Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡŽ LTS-Π²Π΅Ρ€ΡΡ–Ρ”ΡŽ Node

## CΠΊΡ€Ρ–Π½ΡˆΠΎΡ‚ΠΈ

![Screenshoot](./assets/screenshoot-00.png)

---

![Screenshoot](./assets/screenshoot-01.png)

---

![Screenshoot](./assets/screenshoot-02.png)

---

![Screenshoot](./assets/screenshoot-03.png)

---

![Screenshoot](./assets/screenshoot-04.png)

# Node.js ---> commands

npm init -y

npm install cors express

npm install --save-dev nodemon

yarn add commander

or

npm i commander

yarn add nanoid@3.3.4

npm run dev

yarn dev