add sql connection, config through ENV

This commit is contained in:
Timo Volkmann 2020-06-10 09:20:15 +02:00 committed by Timo Volkmann
parent b23a7f6858
commit fccd897f79
6 changed files with 104 additions and 16 deletions

View File

@ -14,19 +14,19 @@
-- Exportiere Datenbank Struktur für travopti -- Exportiere Datenbank Struktur für travopti
DROP DATABASE IF EXISTS `travopti`; DROP DATABASE IF EXISTS `travopti`;
CREATE DATABASE IF NOT EXISTS `travopti` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_german1_ci */; CREATE DATABASE IF NOT EXISTS `travopti` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `travopti`; USE `travopti`;
-- Exportiere Struktur von Tabelle travopti.countries -- Exportiere Struktur von Tabelle travopti.countries
DROP TABLE IF EXISTS `countries`; DROP TABLE IF EXISTS `countries`;
CREATE TABLE IF NOT EXISTS `countries` ( CREATE TABLE IF NOT EXISTS `countries` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(255) COLLATE latin1_german1_ci NOT NULL, `country` varchar(255) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(), `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `country` (`country`) UNIQUE KEY `country` (`country`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.countries: ~37 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.countries: ~37 rows (ungefähr)
DELETE FROM `countries`; DELETE FROM `countries`;
@ -75,9 +75,9 @@ INSERT INTO `countries` (`id`, `country`, `created_at`, `updated_at`) VALUES
DROP TABLE IF EXISTS `regions`; DROP TABLE IF EXISTS `regions`;
CREATE TABLE IF NOT EXISTS `regions` ( CREATE TABLE IF NOT EXISTS `regions` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`region` varchar(255) COLLATE latin1_german1_ci NOT NULL, `region` varchar(255) NOT NULL,
`country_id` int(11) DEFAULT NULL, `country_id` int(11) DEFAULT NULL,
`meteostat_id` int(11) DEFAULT NULL, `meteostat_id` varchar(11) DEFAULT NULL,
`lon` double(22,0) DEFAULT NULL, `lon` double(22,0) DEFAULT NULL,
`lat` double(22,0) DEFAULT NULL, `lat` double(22,0) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(), `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
@ -85,7 +85,7 @@ CREATE TABLE IF NOT EXISTS `regions` (
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
KEY `FK_regions_countries` (`country_id`) USING BTREE, KEY `FK_regions_countries` (`country_id`) USING BTREE,
CONSTRAINT `FK_regions_countries` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON UPDATE CASCADE CONSTRAINT `FK_regions_countries` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.regions: ~47 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.regions: ~47 rows (ungefähr)
DELETE FROM `regions`; DELETE FROM `regions`;
@ -160,7 +160,7 @@ CREATE TABLE IF NOT EXISTS `regions_byt` (
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `region_id` (`region_id`,`travelstyle`) USING BTREE, UNIQUE KEY `region_id` (`region_id`,`travelstyle`) USING BTREE,
CONSTRAINT `FK_regions_byt_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE CONSTRAINT `FK_regions_byt_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.regions_byt: ~141 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.regions_byt: ~141 rows (ungefähr)
DELETE FROM `regions_byt`; DELETE FROM `regions_byt`;
@ -323,7 +323,7 @@ CREATE TABLE IF NOT EXISTS `regions_trivago` (
UNIQUE KEY `region_id_year_month` (`region_id`,`year`,`month`), UNIQUE KEY `region_id_year_month` (`region_id`,`year`,`month`),
KEY `FK_regions_trivago_regions` (`region_id`), KEY `FK_regions_trivago_regions` (`region_id`),
CONSTRAINT `FK_regions_trivago_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE CONSTRAINT `FK_regions_trivago_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1278 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB AUTO_INCREMENT=1278 DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.regions_trivago: ~940 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.regions_trivago: ~940 rows (ungefähr)
DELETE FROM `regions_trivago`; DELETE FROM `regions_trivago`;
@ -1289,7 +1289,7 @@ CREATE TABLE IF NOT EXISTS `region_climate` (
UNIQUE KEY `region_id_year_month` (`region_id`,`year`,`month`), UNIQUE KEY `region_id_year_month` (`region_id`,`year`,`month`),
KEY `FK_region_climate_regions` (`region_id`), KEY `FK_region_climate_regions` (`region_id`),
CONSTRAINT `FK_region_climate_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE CONSTRAINT `FK_region_climate_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.region_climate: ~0 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.region_climate: ~0 rows (ungefähr)
DELETE FROM `region_climate`; DELETE FROM `region_climate`;
@ -1300,14 +1300,14 @@ DELETE FROM `region_climate`;
DROP TABLE IF EXISTS `search_presets`; DROP TABLE IF EXISTS `search_presets`;
CREATE TABLE IF NOT EXISTS `search_presets` ( CREATE TABLE IF NOT EXISTS `search_presets` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`parameter` varchar(255) COLLATE latin1_german1_ci NOT NULL, `parameter` varchar(255) NOT NULL,
`name` varchar(255) COLLATE latin1_german1_ci NOT NULL, `name` varchar(255) NOT NULL,
`value_1` int(11) NOT NULL, `value_1` int(11) NOT NULL,
`value_2` int(11) DEFAULT NULL, `value_2` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(), `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.search_presets: ~0 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.search_presets: ~0 rows (ungefähr)
DELETE FROM `search_presets`; DELETE FROM `search_presets`;
@ -1318,11 +1318,11 @@ DELETE FROM `search_presets`;
DROP TABLE IF EXISTS `search_tags`; DROP TABLE IF EXISTS `search_tags`;
CREATE TABLE IF NOT EXISTS `search_tags` ( CREATE TABLE IF NOT EXISTS `search_tags` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`searchtag` varchar(255) COLLATE latin1_german1_ci NOT NULL, `searchtag` varchar(255) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(), `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.search_tags: ~0 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.search_tags: ~0 rows (ungefähr)
DELETE FROM `search_tags`; DELETE FROM `search_tags`;
@ -1343,7 +1343,7 @@ CREATE TABLE IF NOT EXISTS `user_feedback` (
KEY `FK_user_feedback_search_tags` (`tag_id`), KEY `FK_user_feedback_search_tags` (`tag_id`),
CONSTRAINT `FK_user_feedback_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK_user_feedback_regions` FOREIGN KEY (`region_id`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_user_feedback_search_tags` FOREIGN KEY (`tag_id`) REFERENCES `search_tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE CONSTRAINT `FK_user_feedback_search_tags` FOREIGN KEY (`tag_id`) REFERENCES `search_tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Exportiere Daten aus Tabelle travopti.user_feedback: ~0 rows (ungefähr) -- Exportiere Daten aus Tabelle travopti.user_feedback: ~0 rows (ungefähr)
DELETE FROM `user_feedback`; DELETE FROM `user_feedback`;

5
backend/.env Normal file
View File

@ -0,0 +1,5 @@
METEOSTAT_API_KEY=LMlDskju
DB_HOST=192.168.43.52
DB_USER=root
DB_PASSWORD=devtest
DB_PORT=3307

0
backend/climate.js Normal file
View File

13
backend/dbsql.js Normal file
View File

@ -0,0 +1,13 @@
var mysql = require('mysql');
require('dotenv').config()
console.log(process.env);
var connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
port: process.env.DB_PORT
});
connection.connect();

View File

@ -18,6 +18,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
}, },
"bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
},
"body-parser": { "body-parser": {
"version": "1.19.0", "version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
@ -63,6 +68,11 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
}, },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"debug": { "debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@ -81,6 +91,11 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
}, },
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
},
"ee-first": { "ee-first": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -192,6 +207,11 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
}, },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"media-typer": { "media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -230,6 +250,17 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}, },
"mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"requires": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
}
},
"negotiator": { "negotiator": {
"version": "0.6.2", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@ -253,6 +284,11 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}, },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"proxy-addr": { "proxy-addr": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@ -283,6 +319,20 @@
"unpipe": "1.0.0" "unpipe": "1.0.0"
} }
}, },
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@ -336,11 +386,24 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}, },
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
},
"statuses": { "statuses": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
}, },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"toidentifier": { "toidentifier": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@ -360,6 +423,11 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
}, },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-merge": { "utils-merge": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",

View File

@ -9,6 +9,8 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"express": "^4.17.1" "dotenv": "^8.2.0",
"express": "^4.17.1",
"mysql": "^2.18.1"
} }
} }