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π
- Host: GitHub
- URL: https://github.com/viktorsvertoka/goit-node-hw-01
- Owner: ViktorSvertoka
- Created: 2023-07-23T11:59:55.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2023-07-30T21:12:29.000Z (almost 3 years ago)
- Last Synced: 2025-04-09T03:37:37.269Z (about 1 year ago)
- Topics: gitignore, goit, goit-node-hw-01, json, node, node-js, nodejs, npm, prettier
- Language: JavaScript
- Homepage: https://viktorsvertoka.github.io/goit-node-hw-01/
- Size: 679 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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ΠΊΡΡΠ½ΡΠΎΡΠΈ

---

---

---

---

# 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