이재용

using async function but still have problem

Showing 1 changed file with 77 additions and 79 deletions
var request = require("request");
var express = require('express');
var express = require('express');
var fs=require('fs');
var puuid_url_list=[]
var events=require('events')
var key = "RGAPI-78e43419-9016-45e3-8300-1e5febc8ef54" // LOL API key
var key = "RGAPI-82f68b2b-8db9-4b3d-951a-7684fbb49a4c" // LOL API key
var app = express();
var eventEmitter=new events.EventEmitter();
var bodyParser = require('body-parser');
let puuid
let option
let checking=1
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
var name_list=[] // 유저의 아이디와 매칭되는 고유번호
var puuid_list=[] // puuid 저장을 위한 리스트
eventEmitter.setMaxListeners(200)
app.get('/', function (req, res) {
res.send("My galaxy") // 버튼 구현 (은하계(맵) 으로 이루어진 버튼들) => 버튼 클릭시 해당 url로 get 하여 데이터 획득
});
});
// 버튼 구현 (은하계(맵) 으로 이루어진 버튼들) => 버튼 클릭시 해당 url로 get 하여 데이터 획득
app.get('/galaxy',function(req,res)
......@@ -31,95 +35,89 @@ app.get('/galaxy',function(req,res)
for (var value in name)
{
name_list.push(name[value]["summonerId"])
}
console.log(name_list.length)
if(name_list.length==200)
{
eventEmitter.emit('name_done')
console.log("!")
}
}
}); //request1 END
eventEmitter.on('name_done',function() //url 설정
eventEmitter.on("name_done",function()
{
for (i=0;i<name_list.length;i++)
console.log(name_list.length)
for (i=0; i<name_list.length;i++)
{
console.log("https://kr.api.riotgames.com/tft/summoner/v1/summoners/"+name_list[i])
puuid_url_list.push("https://kr.api.riotgames.com/tft/summoner/v1/summoners/"+name_list[i])
}
eventEmitter.emit("setting_done")
});//setting end
eventEmitter.on("setting_done",function() //puuid 가져오기
{
if (checking==1)
console.log(puuid_url_list)
if (puuid_url_list.length==200)
{
option={
url:puuid_url_list[0],
method: 'GET',
headers:{
"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",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": key}
}
eventEmitter.emit("run_request") //for 문 마다 run_request를 한다.
}
else
{
for (i=1;i<name_list.length;i++)
{
eventEmitter.emit("run_request")
eventEmitter.on('run_request2',function(){
option={
url:puuid_url_list[i],
method: 'GET',
headers:{
"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",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": key}
eventEmitter.emit("puuid_url_done")
break
}
//for 문 마다 run_request를 한다.
});
}
}
eventEmitter.emit('data_received')
});//event-setting done end
eventEmitter.on('run_request',function()//자료 가져오기 (puuid)
{
request(option,function(err,res,body)
});//name_done => puuid_url 설정 완료
eventEmitter.on("puuid_url_done",function(){ //puuid 가져오기
console.log(puuid_url_list)
function delay(option) {
return new Promise(resolve => //option=> request hedear 가 설정되기 전에 request를 해버리는 문제 해결하기위해 promise 사용
setTimeout(() => {
request(option,function(err,res,body)
{
puuid = JSON.parse(body)
console.log(puuid)
puuid=puuid["puuid"]
puuid_list.push(puuid)
console.log(puuid_list)
console.log(puuid_list.length)
if(puuid_list.length==200) //puuid 를 100개는 잘가져오고 100개는 못가져오는 문제 생김
{
eventEmitter.emit("puuid_find_done")
}
});
resolve(); },400) );
}
{
puuid = JSON.parse(body)
puuid=puuid["puuid"]
puuid_list.push(puuid)
if (checking==1)
{
checking=2
eventEmitter.emit("setting_done")
async function loop(puuid_url_list) {
{
for (i=0;i<puuid_url_list.length;i++)
{
option={
url:puuid_url_list[i], //url 값 설정은 확인 완료
method: 'GET',
headers:{
"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",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": key}
}
await delay(option);
}
}
}
else
{
eventEmitter.emit("run_request2")
}
loop(puuid_url_list);
});
}); //run_request end
eventEmitter.on("puuid_find_done",function(){
res.send(puuid_list)
});
});// app end
var server = app.listen(80);
eventEmitter.on('data_received',function(){
console.log(name_list);
console.log(puuid_list)
});
\ No newline at end of file
console.log("run!")
......
  • 라이엇 api 에서 제가 필요한 정보를 받아오려면

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

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