권주희

Merge branch 'feature/getCurAirInfo' into 'develop'

Feature/get cur air info

- get Current Location's Air Information Using API
   - get Current Location's Air Information Using API
   - install axios
   - allow the CORS error to Backend app
- display the result of current air information
   - display the result of current air information 
   - add icon

See merge request !4
1 var createError = require("http-errors"); 1 var createError = require("http-errors");
2 var express = require("express"); 2 var express = require("express");
3 +var cors = require("cors");
3 var path = require("path"); 4 var path = require("path");
4 var cookieParser = require("cookie-parser"); 5 var cookieParser = require("cookie-parser");
5 var logger = require("morgan"); 6 var logger = require("morgan");
...@@ -9,6 +10,7 @@ var usersRouter = require("./routes/users"); ...@@ -9,6 +10,7 @@ var usersRouter = require("./routes/users");
9 var airConditionRouter = require("./routes/airCondition"); 10 var airConditionRouter = require("./routes/airCondition");
10 11
11 var app = express(); 12 var app = express();
13 +app.use(cors());
12 14
13 // view engine setup 15 // view engine setup
14 app.set("views", path.join(__dirname, "views")); 16 app.set("views", path.join(__dirname, "views"));
......
...@@ -4,16 +4,16 @@ ...@@ -4,16 +4,16 @@
4 * Module dependencies. 4 * Module dependencies.
5 */ 5 */
6 6
7 -var app = require('../app'); 7 +var app = require("../app");
8 -var debug = require('debug')('backend:server'); 8 +var debug = require("debug")("backend:server");
9 -var http = require('http'); 9 +var http = require("http");
10 10
11 /** 11 /**
12 * Get port from environment and store in Express. 12 * Get port from environment and store in Express.
13 */ 13 */
14 14
15 -var port = normalizePort(process.env.PORT || '3000'); 15 +var port = normalizePort(process.env.PORT || "3001");
16 -app.set('port', port); 16 +app.set("port", port);
17 17
18 /** 18 /**
19 * Create HTTP server. 19 * Create HTTP server.
...@@ -26,8 +26,8 @@ var server = http.createServer(app); ...@@ -26,8 +26,8 @@ var server = http.createServer(app);
26 */ 26 */
27 27
28 server.listen(port); 28 server.listen(port);
29 -server.on('error', onError); 29 +server.on("error", onError);
30 -server.on('listening', onListening); 30 +server.on("listening", onListening);
31 31
32 /** 32 /**
33 * Normalize a port into a number, string, or false. 33 * Normalize a port into a number, string, or false.
...@@ -54,22 +54,20 @@ function normalizePort(val) { ...@@ -54,22 +54,20 @@ function normalizePort(val) {
54 */ 54 */
55 55
56 function onError(error) { 56 function onError(error) {
57 - if (error.syscall !== 'listen') { 57 + if (error.syscall !== "listen") {
58 throw error; 58 throw error;
59 } 59 }
60 60
61 - var bind = typeof port === 'string' 61 + var bind = typeof port === "string" ? "Pipe " + port : "Port " + port;
62 - ? 'Pipe ' + port
63 - : 'Port ' + port;
64 62
65 // handle specific listen errors with friendly messages 63 // handle specific listen errors with friendly messages
66 switch (error.code) { 64 switch (error.code) {
67 - case 'EACCES': 65 + case "EACCES":
68 - console.error(bind + ' requires elevated privileges'); 66 + console.error(bind + " requires elevated privileges");
69 process.exit(1); 67 process.exit(1);
70 break; 68 break;
71 - case 'EADDRINUSE': 69 + case "EADDRINUSE":
72 - console.error(bind + ' is already in use'); 70 + console.error(bind + " is already in use");
73 process.exit(1); 71 process.exit(1);
74 break; 72 break;
75 default: 73 default:
...@@ -83,8 +81,6 @@ function onError(error) { ...@@ -83,8 +81,6 @@ function onError(error) {
83 81
84 function onListening() { 82 function onListening() {
85 var addr = server.address(); 83 var addr = server.address();
86 - var bind = typeof addr === 'string' 84 + var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port;
87 - ? 'pipe ' + addr 85 + debug("Listening on " + bind);
88 - : 'port ' + addr.port;
89 - debug('Listening on ' + bind);
90 } 86 }
......
...@@ -228,6 +228,15 @@ ...@@ -228,6 +228,15 @@
228 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", 228 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
229 "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" 229 "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
230 }, 230 },
231 + "cors": {
232 + "version": "2.8.5",
233 + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
234 + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
235 + "requires": {
236 + "object-assign": "^4",
237 + "vary": "^1"
238 + }
239 + },
231 "debug": { 240 "debug": {
232 "version": "2.6.9", 241 "version": "2.6.9",
233 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 242 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
8 "dependencies": { 8 "dependencies": {
9 "axios": "^0.19.2", 9 "axios": "^0.19.2",
10 "cookie-parser": "~1.4.3", 10 "cookie-parser": "~1.4.3",
11 + "cors": "^2.8.5",
11 "debug": "~2.6.9", 12 "debug": "~2.6.9",
12 "express": "~4.16.0", 13 "express": "~4.16.0",
13 "http-errors": "~1.6.2", 14 "http-errors": "~1.6.2",
......
...@@ -7,7 +7,7 @@ const googleMapKey = require("./secrets.json").googleAPIKey; ...@@ -7,7 +7,7 @@ const googleMapKey = require("./secrets.json").googleAPIKey;
7 7
8 axios.create({ 8 axios.create({
9 // TODO : 웹을 AWS에 올릴때, 해당 baseURL이 달라져야할 수 있음 9 // TODO : 웹을 AWS에 올릴때, 해당 baseURL이 달라져야할 수 있음
10 - baseURL: "http://localhost:3000", 10 + baseURL: "http://localhost:3001",
11 responseType: "json", 11 responseType: "json",
12 }); 12 });
13 13
......
...@@ -2636,6 +2636,37 @@ ...@@ -2636,6 +2636,37 @@
2636 "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 2636 "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
2637 "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" 2637 "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
2638 }, 2638 },
2639 + "axios": {
2640 + "version": "0.19.2",
2641 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
2642 + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
2643 + "requires": {
2644 + "follow-redirects": "1.5.10"
2645 + },
2646 + "dependencies": {
2647 + "debug": {
2648 + "version": "3.1.0",
2649 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
2650 + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
2651 + "requires": {
2652 + "ms": "2.0.0"
2653 + }
2654 + },
2655 + "follow-redirects": {
2656 + "version": "1.5.10",
2657 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
2658 + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
2659 + "requires": {
2660 + "debug": "=3.1.0"
2661 + }
2662 + },
2663 + "ms": {
2664 + "version": "2.0.0",
2665 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2666 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
2667 + }
2668 + }
2669 + },
2639 "axobject-query": { 2670 "axobject-query": {
2640 "version": "2.1.2", 2671 "version": "2.1.2",
2641 "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", 2672 "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz",
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
6 "@testing-library/jest-dom": "^4.2.4", 6 "@testing-library/jest-dom": "^4.2.4",
7 "@testing-library/react": "^9.3.2", 7 "@testing-library/react": "^9.3.2",
8 "@testing-library/user-event": "^7.1.2", 8 "@testing-library/user-event": "^7.1.2",
9 + "axios": "^0.19.2",
9 "bootstrap": "^3.4.1", 10 "bootstrap": "^3.4.1",
10 "daum-map-api": "^1.0.2", 11 "daum-map-api": "^1.0.2",
11 "react": "^16.13.1", 12 "react": "^16.13.1",
......
1 +import axios from "axios";
2 +
3 +export default axios.create({
4 + baseURL: "http://localhost:3001",
5 + responseType: "json",
6 +});
...@@ -5,6 +5,12 @@ import Button from "react-bootstrap/Button"; ...@@ -5,6 +5,12 @@ import Button from "react-bootstrap/Button";
5 import "./home.css"; 5 import "./home.css";
6 import { Map, Marker, MarkerClusterer, Polyline } from "react-kakao-maps"; 6 import { Map, Marker, MarkerClusterer, Polyline } from "react-kakao-maps";
7 import "bootstrap/dist/css/bootstrap.min.css"; 7 import "bootstrap/dist/css/bootstrap.min.css";
8 +import API from "./API";
9 +import veryGood from "./gradeIcon/cool.png";
10 +import good from "./gradeIcon/smile.png";
11 +import bad from "./gradeIcon/angry.png";
12 +import veryBad from "./gradeIcon/devil.png";
13 +import next from "./gradeIcon/next.png";
8 14
9 /* global kakao */ 15 /* global kakao */
10 16
...@@ -21,6 +27,7 @@ export default class Home extends Component { ...@@ -21,6 +27,7 @@ export default class Home extends Component {
21 placeSearch: new kakao.maps.services.Places(), 27 placeSearch: new kakao.maps.services.Places(),
22 infoWindow: new kakao.maps.CustomOverlay({}), 28 infoWindow: new kakao.maps.CustomOverlay({}),
23 region: "은평구청", 29 region: "은평구청",
30 + curAirCondition: null,
24 31
25 // curAirCondition: null, 32 // curAirCondition: null,
26 // routeInformation: null, 33 // routeInformation: null,
...@@ -254,6 +261,25 @@ export default class Home extends Component { ...@@ -254,6 +261,25 @@ export default class Home extends Component {
254 let position = marker.getPosition(); 261 let position = marker.getPosition();
255 console.log(marker.getPosition()); 262 console.log(marker.getPosition());
256 console.log(position["Ga"]); 263 console.log(position["Ga"]);
264 + API.get("/airCondition", {
265 + params: {
266 + latitude: position["Ha"],
267 + longitude: position["Ga"],
268 + },
269 + })
270 + .then((response) => {
271 + console.log("Success");
272 + console.log(response.data);
273 + this.setState({
274 + curAirCondition: response.data,
275 + });
276 + })
277 + .catch(function (error) {
278 + console.log(error);
279 + })
280 + .finally(function () {
281 + // always executed
282 + });
257 }; 283 };
258 let setDepart = document.createElement("Button"); 284 let setDepart = document.createElement("Button");
259 setDepart.innerHTML = "출발지로 설정하기"; 285 setDepart.innerHTML = "출발지로 설정하기";
...@@ -309,6 +335,52 @@ export default class Home extends Component { ...@@ -309,6 +335,52 @@ export default class Home extends Component {
309 335
310 render() { 336 render() {
311 let currentAirCondition = null; 337 let currentAirCondition = null;
338 + if (this.state.curAirCondition != null) {
339 + let pm10Image = null;
340 + let pm25Image = null;
341 + switch (this.state.curAirCondition.pm10Grade) {
342 + case "1":
343 + pm10Image = <img src={veryGood} width="50px" heigth="100px" />;
344 + break;
345 + case "2":
346 + pm10Image = <img src={good} width="50px" heigth="100px" />;
347 + break;
348 + case "3":
349 + pm10Image = <img src={bad} width="50px" heigth="100px" />;
350 + break;
351 + case "4":
352 + pm10Image = <img src={veryBad} width="50px" heigth="100px" />;
353 + break;
354 + default:
355 + pm10Image = null;
356 + }
357 + switch (this.state.curAirCondition.pm25Grade) {
358 + case "1":
359 + pm25Image = <img src={veryGood} width="50px" heigth="100px" />;
360 + break;
361 + case "2":
362 + pm25Image = <img src={good} width="50px" heigth="100px" />;
363 + break;
364 + case "3":
365 + pm25Image = <img src={bad} width="50px" heigth="100px" />;
366 + break;
367 + case "4":
368 + pm25Image = <img src={veryBad} width="50px" heigth="100px" />;
369 + break;
370 + default:
371 + pm25Image = null;
372 + }
373 + currentAirCondition = (
374 + <h5>
375 + <br />
376 + <br />
377 + <br /> 미세먼지 등급 <br /> {pm10Image} <br />
378 + 미세먼지 지수 : {this.state.curAirCondition.pm10Value} <br />
379 + 초미세먼지 등급 <br /> {pm25Image} <br />
380 + 초미세먼지 지수 : {this.state.curAirCondition.pm25Value} <br />{" "}
381 + </h5>
382 + );
383 + }
312 let routeAirCondition = null; 384 let routeAirCondition = null;
313 385
314 return ( 386 return (
......