이유혁

Promise pattern refactoring

Showing 1 changed file with 84 additions and 86 deletions
var express = require('express');
var app = express();
const express = require('express');
const config = require('./API_config');
const line = require('@line/bot-sdk');
const request = require('request');
//papago api
var request = require('request');
const app = express();
//번역 api_url
var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
const translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
//언어감지 api_url
var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
const languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
// Naver Auth Key
//새로 발급받은 naver papago api id, pw 입력
const client_id = config.client_id;
const client_secret = config.client_secret;
// Line Channel Access Tocken
const config = config.line_channel;
const line_channel = config.line_channel;
// create LINE SDK client
const client = new line.Client(config);
// create Express app
// about Express itself: https://expressjs.com/
const client = new line.Client(line_channel);
// ELB health checker
app.get('/', (req, res) => {
console.log('hello,,,,');
console.log('ELB health check');
res.writeHead(200, { "Content-Type": "text/html" });
res.end();
});
// register a webhook handler with middleware
// about the middleware, please refer to doc
app.post('/webhook', line.middleware(config), (req, res) => {
Promise
.all(req.body.events.map(event => handleEvent(event)))
.then((result) => res.json(result))
app.post('/webhook', line.middleware(line_channel), (req, res) => {
const promises = req.body.events.map(async (event) => {
let language_type = await language_detector(event);
let options = await option_maker(language_type);
let result = await receive_result(options);
client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
})
Promise
.all(promises)
.then((result) => res.json(result))
.catch((err) => {
console.error(err);
res.status(200).end();
});
});
// event handler
function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
// ignore non-text-message event
return Promise.resolve(null);
}
return new Promise(function(resolve, reject) {
//언어 감지 option
var detect_options = {
url : languagedetect_api_url,
form : {'query': event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
};
//papago 언어 감지
request.post(detect_options,function(error,response,body){
console.log(response.statusCode);
if(!error && response.statusCode == 200){
var detect_body = JSON.parse(response.body);
var source = '';
var target = '';
var result = { type: 'text', text:''};
//언어 감지가 제대로 됐는지 확인
console.log(detect_body.langCode);
//번역은 한국어->영어 / 영어->한국어만 지원
if(detect_body.langCode == 'ko'||detect_body.langCode == 'en'||detect_body.langCode=='ru'||detect_body.langCode=='ja'){
source = detect_body.langCode;
if(source!='ko'){
target='ko';
}
// target = source == 'ko' ? 'en':'ko';
//papago 번역 option
var options = {
url: translate_api_url,
// 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text)
form: {'source':source, 'target':target, 'text':event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
};
// Naver Post API
request.post(options, function(error, response, body){
// Translate API Sucess
if(!error && response.statusCode == 200){
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
}
});
}
// 메시지의 언어가 영어 또는 한국어가 아닐 경우
else{
result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.';
client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
}
}
});
});
}
const language_detector = (event) => {
if (event.type !== 'message' || event.message.type !== 'text') {
// ignore non-text-message event
return reject(new Error('메세지 혹은, 텍스트가 아닙니다.'));
}
return new Promise((resolve) => {
//언어 감지 option
resolve({
url : languagedetect_api_url,
form : {'query': event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
});
})
}
const option_maker = (language_type) => {
return new Promise((resolve, reject) => {
request.post(language_type, (error,response) => {
console.log(response.statusCode);
if(!error && response.statusCode == 200){
let detect_body = JSON.parse(response.body);
let source = '';
let target = '';
if (detect_body.langCode == 'ko'||detect_body.langCode =='en'){
source = detect_body.langCode =='ko'? 'ko':'en';
target = detect_body.langCode =='ko'? 'en':'ko';
}
//언어 감지가 제대로 됐는지 확인
console.log(detect_body.langCode);
source = detect_body.langCode;
var options = {
url: translate_api_url,
form: {'source':source, 'target': target, 'text':event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
};
resolve(options);
}
else{
reject(new Error("request is failed"));
}
})
})
}
const receive_result = (options) => {
return new Promise((resolve, reject) => {
var result = { type:'text', text: ''};
request.post(options, (error, response) => {
// Translate API Sucess
if(!error && response.statusCode == 200){
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
resolve(result);
}
else{
result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.';
client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
reject(new Error("request is failed"));
}
})
})
}
app.listen(3000, function () {
console.log('Linebot listening on port 3000!');
......