이재용

using async function but still have problem

Showing 1 changed file with 56 additions and 58 deletions
1 var request = require("request"); 1 var request = require("request");
2 var express = require('express'); 2 var express = require('express');
3 +var fs=require('fs');
3 var puuid_url_list=[] 4 var puuid_url_list=[]
4 var events=require('events') 5 var events=require('events')
5 -var key = "RGAPI-78e43419-9016-45e3-8300-1e5febc8ef54" // LOL API key 6 +var key = "RGAPI-82f68b2b-8db9-4b3d-951a-7684fbb49a4c" // LOL API key
6 var app = express(); 7 var app = express();
7 var eventEmitter=new events.EventEmitter(); 8 var eventEmitter=new events.EventEmitter();
8 var bodyParser = require('body-parser'); 9 var bodyParser = require('body-parser');
9 let puuid 10 let puuid
10 let option 11 let option
11 -let checking=1
12 app.use(bodyParser.urlencoded({ extended: false })); 12 app.use(bodyParser.urlencoded({ extended: false }));
13 app.use(bodyParser.json()); 13 app.use(bodyParser.json());
14 var name_list=[] // 유저의 아이디와 매칭되는 고유번호 14 var name_list=[] // 유저의 아이디와 매칭되는 고유번호
15 var puuid_list=[] // puuid 저장을 위한 리스트 15 var puuid_list=[] // puuid 저장을 위한 리스트
16 +eventEmitter.setMaxListeners(200)
17 +
18 +
16 19
17 20
18 app.get('/', function (req, res) { 21 app.get('/', function (req, res) {
19 - res.send("My galaxy") // 버튼 구현 (은하계(맵) 으로 이루어진 버튼들) => 버튼 클릭시 해당 url로 get 하여 데이터 획득 22 +
20 -}); 23 + });
24 + // 버튼 구현 (은하계(맵) 으로 이루어진 버튼들) => 버튼 클릭시 해당 url로 get 하여 데이터 획득
21 25
22 26
23 app.get('/galaxy',function(req,res) 27 app.get('/galaxy',function(req,res)
...@@ -31,50 +35,63 @@ app.get('/galaxy',function(req,res) ...@@ -31,50 +35,63 @@ app.get('/galaxy',function(req,res)
31 for (var value in name) 35 for (var value in name)
32 { 36 {
33 name_list.push(name[value]["summonerId"]) 37 name_list.push(name[value]["summonerId"])
38 + console.log(name_list.length)
34 39
35 - } 40 + if(name_list.length==200)
41 + {
36 eventEmitter.emit('name_done') 42 eventEmitter.emit('name_done')
43 + console.log("!")
44 + }
45 + }
37 }); //request1 END 46 }); //request1 END
38 47
39 - 48 + eventEmitter.on("name_done",function()
40 - eventEmitter.on('name_done',function() //url 설정
41 { 49 {
42 - 50 + console.log(name_list.length)
43 - for (i=0;i<name_list.length;i++) 51 + for (i=0; i<name_list.length;i++)
44 { 52 {
53 + console.log("https://kr.api.riotgames.com/tft/summoner/v1/summoners/"+name_list[i])
45 puuid_url_list.push("https://kr.api.riotgames.com/tft/summoner/v1/summoners/"+name_list[i]) 54 puuid_url_list.push("https://kr.api.riotgames.com/tft/summoner/v1/summoners/"+name_list[i])
46 - 55 + console.log(puuid_url_list)
56 + if (puuid_url_list.length==200)
57 + {
58 + eventEmitter.emit("puuid_url_done")
59 + break
60 + }
47 } 61 }
48 - eventEmitter.emit("setting_done")
49 -});//setting end
50 62
63 + });//name_done => puuid_url 설정 완료
51 64
52 - eventEmitter.on("setting_done",function() //puuid 가져오기 65 + eventEmitter.on("puuid_url_done",function(){ //puuid 가져오기
66 + console.log(puuid_url_list)
67 + function delay(option) {
68 + return new Promise(resolve => //option=> request hedear 가 설정되기 전에 request를 해버리는 문제 해결하기위해 promise 사용
69 + setTimeout(() => {
70 + request(option,function(err,res,body)
53 { 71 {
54 - if (checking==1) 72 +
73 + puuid = JSON.parse(body)
74 + console.log(puuid)
75 + puuid=puuid["puuid"]
76 + puuid_list.push(puuid)
77 + console.log(puuid_list)
78 + console.log(puuid_list.length)
79 + if(puuid_list.length==200) //puuid 를 100개는 잘가져오고 100개는 못가져오는 문제 생김
55 { 80 {
56 - option={ 81 + eventEmitter.emit("puuid_find_done")
57 - url:puuid_url_list[0],
58 - method: 'GET',
59 - headers:{
60 - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36",
61 - "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
62 - "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
63 - "Origin": "https://developer.riotgames.com",
64 - "X-Riot-Token": key}
65 } 82 }
66 - eventEmitter.emit("run_request") //for 문 마다 run_request를 한다. 83 + });
67 - 84 + resolve(); },400) );
68 } 85 }
69 - else
70 - {
71 86
72 - for (i=1;i<name_list.length;i++) 87 + async function loop(puuid_url_list) {
88 +
73 { 89 {
74 - eventEmitter.emit("run_request") 90 + for (i=0;i<puuid_url_list.length;i++)
75 - eventEmitter.on('run_request2',function(){ 91 + {
92 +
76 option={ 93 option={
77 - url:puuid_url_list[i], 94 + url:puuid_url_list[i], //url 값 설정은 확인 완료
78 method: 'GET', 95 method: 'GET',
79 headers:{ 96 headers:{
80 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36", 97 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36",
...@@ -83,43 +100,24 @@ app.get('/galaxy',function(req,res) ...@@ -83,43 +100,24 @@ app.get('/galaxy',function(req,res)
83 "Origin": "https://developer.riotgames.com", 100 "Origin": "https://developer.riotgames.com",
84 "X-Riot-Token": key} 101 "X-Riot-Token": key}
85 } 102 }
86 - //for 문 마다 run_request를 한다.
87 - });
88 - }
89 -}
90 - eventEmitter.emit('data_received')
91 -
92 - });//event-setting done end
93 -
94 -eventEmitter.on('run_request',function()//자료 가져오기 (puuid)
95 -{
96 - request(option,function(err,res,body)
97 103
98 - {
99 - puuid = JSON.parse(body)
100 - puuid=puuid["puuid"]
101 - puuid_list.push(puuid)
102 - if (checking==1)
103 - {
104 - checking=2
105 - eventEmitter.emit("setting_done")
106 104
105 + await delay(option);
107 106
108 } 107 }
109 - else
110 - {
111 - eventEmitter.emit("run_request2")
112 } 108 }
113 109
110 + }
111 + loop(puuid_url_list);
114 }); 112 });
115 -}); //run_request end
116 113
114 + eventEmitter.on("puuid_find_done",function(){
115 +
116 + res.send(puuid_list)
117 + });
117 118
118 });// app end 119 });// app end
119 120
120 121
121 var server = app.listen(80); 122 var server = app.listen(80);
122 -eventEmitter.on('data_received',function(){
123 - console.log(name_list);
124 - console.log(puuid_list)
125 -});
...\ No newline at end of file ...\ No newline at end of file
123 +console.log("run!")
......
  • 라이엇 api 에서 제가 필요한 정보를 받아오려면

    1. 사용자 아이디를 입력하여 아이디 값 (line 의 유저아이디와 비슷한 형태) 를 받아 옵니다.
    2. 이 아이디값으로 puuid 값을 받아 옵니다.
    3. puuid 를 사용하여 게임 정보를 가져옵니다. 단계로 진행해야 합니다.

    현재 1번은 해결을 하였고 2번 과정에서 각자 다른 주소 200개를 request 해줘야하는데 이 과정에서 주석과 같이 100개 만 들어오고 100개는 손실되는 경우가 발생합니다. 서버 코드를 확인해보니 429 Rate limit exceeded 가 나옵니다. 통계적 자료이기 때문에 200명의 자료 모두 사용하고자 하지만 해결방안이 없으면 100명의 자료를 기준으로 하고자합니다.