이재용

using async function but still have problem

Showing 1 changed file with 77 additions and 79 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,95 +35,89 @@ app.get('/galaxy',function(req,res) ...@@ -31,95 +35,89 @@ 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"])
34 - 38 + console.log(name_list.length)
35 - } 39 +
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)
47 - } 56 + if (puuid_url_list.length==200)
48 - eventEmitter.emit("setting_done")
49 -});//setting end
50 -
51 -
52 - eventEmitter.on("setting_done",function() //puuid 가져오기
53 - {
54 - if (checking==1)
55 { 57 {
56 - option={ 58 + eventEmitter.emit("puuid_url_done")
57 - url:puuid_url_list[0], 59 + break
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 - }
66 - eventEmitter.emit("run_request") //for 문 마다 run_request를 한다.
67 -
68 - }
69 - else
70 - {
71 -
72 - for (i=1;i<name_list.length;i++)
73 - {
74 - eventEmitter.emit("run_request")
75 - eventEmitter.on('run_request2',function(){
76 - option={
77 - url:puuid_url_list[i],
78 - method: 'GET',
79 - 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",
81 - "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
82 - "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
83 - "Origin": "https://developer.riotgames.com",
84 - "X-Riot-Token": key}
85 } 60 }
86 - //for 문 마다 run_request를 한다.
87 - });
88 } 61 }
89 -}
90 - eventEmitter.emit('data_received')
91 62
92 - });//event-setting done end 63 + });//name_done => puuid_url 설정 완료
93 - 64 +
94 -eventEmitter.on('run_request',function()//자료 가져오기 (puuid) 65 + eventEmitter.on("puuid_url_done",function(){ //puuid 가져오기
95 -{ 66 + console.log(puuid_url_list)
96 - request(option,function(err,res,body) 67 + function delay(option) {
68 + return new Promise(resolve => //option=> request hedear 가 설정되기 전에 request를 해버리는 문제 해결하기위해 promise 사용
69 + setTimeout(() => {
70 + request(option,function(err,res,body)
71 + {
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개는 못가져오는 문제 생김
80 + {
81 + eventEmitter.emit("puuid_find_done")
82 + }
83 + });
84 + resolve(); },400) );
85 + }
97 86
98 - { 87 + async function loop(puuid_url_list) {
99 - puuid = JSON.parse(body) 88 +
100 - puuid=puuid["puuid"] 89 + {
101 - puuid_list.push(puuid) 90 + for (i=0;i<puuid_url_list.length;i++)
102 - if (checking==1) 91 + {
103 - { 92 +
104 - checking=2 93 + option={
105 - eventEmitter.emit("setting_done") 94 + url:puuid_url_list[i], //url 값 설정은 확인 완료
106 - 95 + method: 'GET',
96 + headers:{
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",
98 + "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
99 + "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
100 + "Origin": "https://developer.riotgames.com",
101 + "X-Riot-Token": key}
102 + }
103 +
104 +
105 + await delay(option);
107 106
107 + }
108 + }
109 +
108 } 110 }
109 - else 111 + loop(puuid_url_list);
110 - {
111 - eventEmitter.emit("run_request2")
112 - }
113 -
114 }); 112 });
115 -}); //run_request end 113 +
116 - 114 + eventEmitter.on("puuid_find_done",function(){
117 - 115 +
116 + res.send(puuid_list)
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명의 자료를 기준으로 하고자합니다.