이유혁

Promise pattern refactoring

Showing 1 changed file with 53 additions and 55 deletions
1 -var express = require('express'); 1 +const express = require('express');
2 -var app = express();
3 const config = require('./API_config'); 2 const config = require('./API_config');
4 const line = require('@line/bot-sdk'); 3 const line = require('@line/bot-sdk');
4 +const request = require('request');
5 5
6 -//papago api 6 +const app = express();
7 -var request = require('request');
8 7
9 //번역 api_url 8 //번역 api_url
10 -var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt'; 9 +const translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
11 10
12 //언어감지 api_url 11 //언어감지 api_url
13 -var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs'; 12 +const languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
14 13
15 // Naver Auth Key 14 // Naver Auth Key
16 //새로 발급받은 naver papago api id, pw 입력 15 //새로 발급받은 naver papago api id, pw 입력
17 const client_id = config.client_id; 16 const client_id = config.client_id;
18 const client_secret = config.client_secret; 17 const client_secret = config.client_secret;
19 // Line Channel Access Tocken 18 // Line Channel Access Tocken
20 -const config = config.line_channel; 19 +const line_channel = config.line_channel;
21 20
22 // create LINE SDK client 21 // create LINE SDK client
23 -const client = new line.Client(config); 22 +const client = new line.Client(line_channel);
24 -
25 -// create Express app
26 -// about Express itself: https://expressjs.com/
27 23
28 // ELB health checker 24 // ELB health checker
29 app.get('/', (req, res) => { 25 app.get('/', (req, res) => {
30 - console.log('hello,,,,'); 26 + console.log('ELB health check');
31 res.writeHead(200, { "Content-Type": "text/html" }); 27 res.writeHead(200, { "Content-Type": "text/html" });
32 res.end(); 28 res.end();
33 }); 29 });
34 30
35 // register a webhook handler with middleware 31 // register a webhook handler with middleware
36 // about the middleware, please refer to doc 32 // about the middleware, please refer to doc
37 -app.post('/webhook', line.middleware(config), (req, res) => { 33 +app.post('/webhook', line.middleware(line_channel), (req, res) => {
34 + const promises = req.body.events.map(async (event) => {
35 + let language_type = await language_detector(event);
36 + let options = await option_maker(language_type);
37 + let result = await receive_result(options);
38 + client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
39 + })
38 Promise 40 Promise
39 - .all(req.body.events.map(event => handleEvent(event))) 41 + .all(promises)
40 .then((result) => res.json(result)) 42 .then((result) => res.json(result))
41 .catch((err) => { 43 .catch((err) => {
42 console.error(err); 44 console.error(err);
...@@ -44,76 +46,72 @@ app.post('/webhook', line.middleware(config), (req, res) => { ...@@ -44,76 +46,72 @@ app.post('/webhook', line.middleware(config), (req, res) => {
44 }); 46 });
45 }); 47 });
46 48
47 -// event handler 49 +const language_detector = (event) => {
48 -function handleEvent(event) {
49 if (event.type !== 'message' || event.message.type !== 'text') { 50 if (event.type !== 'message' || event.message.type !== 'text') {
50 // ignore non-text-message event 51 // ignore non-text-message event
51 - return Promise.resolve(null); 52 + return reject(new Error('메세지 혹은, 텍스트가 아닙니다.'));
52 } 53 }
53 - return new Promise(function(resolve, reject) { 54 + return new Promise((resolve) => {
54 //언어 감지 option 55 //언어 감지 option
55 - var detect_options = { 56 + resolve({
56 url : languagedetect_api_url, 57 url : languagedetect_api_url,
57 form : {'query': event.message.text}, 58 form : {'query': event.message.text},
58 headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} 59 headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
59 - }; 60 + });
61 + })
62 +}
60 63
61 - //papago 언어 감지 64 +const option_maker = (language_type) => {
62 - request.post(detect_options,function(error,response,body){ 65 + return new Promise((resolve, reject) => {
66 + request.post(language_type, (error,response) => {
63 console.log(response.statusCode); 67 console.log(response.statusCode);
64 if(!error && response.statusCode == 200){ 68 if(!error && response.statusCode == 200){
65 - var detect_body = JSON.parse(response.body); 69 + let detect_body = JSON.parse(response.body);
66 - var source = ''; 70 + let source = '';
67 - var target = ''; 71 + let target = '';
68 - var result = { type: 'text', text:''}; 72 + if (detect_body.langCode == 'ko'||detect_body.langCode =='en'){
69 - 73 + source = detect_body.langCode =='ko'? 'ko':'en';
74 + target = detect_body.langCode =='ko'? 'en':'ko';
75 + }
70 //언어 감지가 제대로 됐는지 확인 76 //언어 감지가 제대로 됐는지 확인
71 console.log(detect_body.langCode); 77 console.log(detect_body.langCode);
72 -
73 -
74 - //번역은 한국어->영어 / 영어->한국어만 지원
75 - if(detect_body.langCode == 'ko'||detect_body.langCode == 'en'||detect_body.langCode=='ru'||detect_body.langCode=='ja'){
76 source = detect_body.langCode; 78 source = detect_body.langCode;
77 - if(source!='ko'){ 79 +
78 - target='ko';
79 - }
80 - // target = source == 'ko' ? 'en':'ko';
81 - //papago 번역 option
82 var options = { 80 var options = {
83 url: translate_api_url, 81 url: translate_api_url,
84 - // 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text) 82 + form: {'source':source, 'target': target, 'text':event.message.text},
85 - form: {'source':source, 'target':target, 'text':event.message.text},
86 headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} 83 headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
87 }; 84 };
88 - 85 + resolve(options);
89 - // Naver Post API 86 + }
90 - request.post(options, function(error, response, body){ 87 + else{
88 + reject(new Error("request is failed"));
89 + }
90 + })
91 + })
92 +}
93 +
94 +const receive_result = (options) => {
95 + return new Promise((resolve, reject) => {
96 + var result = { type:'text', text: ''};
97 + request.post(options, (error, response) => {
91 // Translate API Sucess 98 // Translate API Sucess
92 if(!error && response.statusCode == 200){ 99 if(!error && response.statusCode == 200){
93 // JSON 100 // JSON
94 var objBody = JSON.parse(response.body); 101 var objBody = JSON.parse(response.body);
95 // Message 잘 찍히는지 확인 102 // Message 잘 찍히는지 확인
96 -
97 result.text = objBody.message.result.translatedText; 103 result.text = objBody.message.result.translatedText;
98 console.log(result.text); 104 console.log(result.text);
99 - //번역된 문장 보내기 105 + resolve(result);
100 - client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
101 } 106 }
102 - });
103 - }
104 - // 메시지의 언어가 영어 또는 한국어가 아닐 경우
105 else{ 107 else{
106 result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.'; 108 result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.';
107 client.replyMessage(event.replyToken,result).then(resolve).catch(reject); 109 client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
110 + reject(new Error("request is failed"));
108 } 111 }
109 - 112 + })
110 - } 113 + })
111 - 114 +}
112 - });
113 -
114 - });
115 - }
116 -
117 115
118 app.listen(3000, function () { 116 app.listen(3000, function () {
119 console.log('Linebot listening on port 3000!'); 117 console.log('Linebot listening on port 3000!');
......