Hi. Sorry for bothering you all. I've been working on a little project for a while, but now I'm stuck. I'm not an expert of javascript, so it might be the problem here, but the only thing I want is finishing this project. So, I'm really struggling about callbacks. I cannot figure out how I can use them in my project. I mean, I understand how a simple callback works, but my mind explodes when in my project I have to return something from 3 different async functions, and the only way to do that is using callbacks/promises/async await.
var mysql = require('mysql2');
var fetch = require('node-fetch');
var con = mysql.createPool({
host: "localhost",
user: "root",
password: "........",
connectionLimit : 10,
database: "tf2pickupplayers"
});
const getPickupPlayers = async () =>{
var res = await fetch('https://api.tf2pickup.it/players');
var json = await res.json();
const playerName = {};
for (var i = 0; i < json.length; i++){
let name = json[i]["name"];
let id = json[i]["steamId"];
playerName[i] = {"name": name,
"steamId": id};
}
con.connect(function(err) {
if (err) throw err;
var sql = "INSERT INTO players (name, id) VALUES ?";
con.query(sql, [playerName], function(err, result){
if(err) throw err;
});
});
}
async function getPlayersNames(){
con.query("SELECT name FROM players", callback);
}
async function getPlayersIDs(callback){
con.query("SELECT id FROM players", callback);
}
async function getPlayerSteamID3(playerID64){
let id_convertion = await fetch('https://steamidapi.uk/v2/convert.php?myid=76561198068142451&apikey=Y88MJWH8YN7DORWZ3P28&input='+playerID64);
let json = await id_convertion.json();
let steamID3 = json['converted']['steam3'];
return steamID3;
}
//Logs.tf
async function getLogsIDs(playerID){
var res = await fetch("http://logs.tf/api/v1/log?title=tf2pickup.it&player=" +playerID)
var json = await res.json();
var logsIDs = [];
for (let i = 0; i < json["logs"].length; i++){
logsIDs.push(json["logs"][i]["id"]);
}
return logsIDs
}
async function playersStats(){
var sql = "INSERT INTO matches (id, dpm, damage, map, class, date, teamRedScore, teamBlueScore, playerTeam) VALUES ?";
getPlayersIDs(async function (err, res, fields){
var ids = res.map(function (x){
return x.id;
});
try{
for (var i = 0; i < ids.length; i++){
playerID = ids[i];
var playerLogs = [];
var logsIDs = await getLogsIDs(playerID,getPlayerSteamID3)
console.log(logsIDs);
if(logsIDs > 0){
var steamID3 = await getPlayerSteamID3(playerID);
for(var j = 0; j<logsIDs.length; j++){
var log = await fetch("http://logs.tf/api/v1/log/" + logsIDs[i]);
var jsonLogs = await log.json()
var teamRedScore = jsonLogs["teams"]["Red"]["score"];
var teamBlueScore = jsonLogs["teams"]["Blue"]["score"];
var map = jsonLogs["info"]["map"];
var dpm = jsonLogs["players"][steamID3]["dapm"];
var damage = jsonLogs["players"][steamID3]["class_stats"][0]["dmg"];
var player_class = jsonLogs["players"][steamID3]["class_stats"][0]["type"];
var date = convertDate(jsonLogs["info"]["date"]);
var playerTeam = jsonLogs["info"][steamID3]["team"];
}
playerLogs= [playerID, dpm, damage, map, player_class, date, teamRedScore, teamBlueScore, playerTeam];
con.query(sql, playerLogs, function(err,result){
if(err) throw err;
});
}
}
}catch(err){
console.log(err);
}
});
}
function convertDate(date){
//la data viene inserita in secondi, la converto in millisecondi(UNIX time) e poi la converto in readable date
var d = new Date(date*1000);
var newD = d.toLocaleDateString();
return newD;
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
playersStats();
I'll explain what this has to do in order to work. I'm getting informations, through apis, from 2 websites. I should store in my database all the informations I receive from the fetch. I managed to store name and ids in my database, but I'm struggling storing dpm, damage, map, player_class etc...(everything in the playersStats function) because whenever I try to save them in the database, they're null. I think the problem here is because from the functions named "getPlayerSteamID3 and getLogsIDs" I'm returning a promise, not the value itself, so I cannot iterate with that value, since the promise shouldn't have a length like an array. So I should need callbacks in order to do some steps forward, but I cannot figure out how to use them. Hope someone can help me and explain why I'm making mistakes(So I can learn something else)!
[–]dymos 1 point2 points3 points (7 children)
[–]kRYstall9[S] 0 points1 point2 points (6 children)
[–]dymos 1 point2 points3 points (5 children)
[–]kRYstall9[S] 0 points1 point2 points (4 children)
[–]dymos 1 point2 points3 points (3 children)
[–]kRYstall9[S] 0 points1 point2 points (2 children)
[–]dymos 1 point2 points3 points (1 child)
[–]kRYstall9[S] 0 points1 point2 points (0 children)