Cant access data from API request even though console.log shows it exists (ASYNC)











up vote
0
down vote

favorite












I'm currently working on an API route that returns the user data for the person that is logged in, I'm combining this data to other stuff that is already stored in my redis middleware. My Objecthandler is working fine but I cannot seem to complete the full scope since my actually getUserData function that is intended to show the object as an API response just returns undefined, even though my object handler can log the correct data. This leads me to believe that I have some problems with the async aspects of nodejs, Im trying to figure out how to solve this, I did not manage it with callbacks and I can't seem to figure out how to use promises either since I am relatively new to nodejs and javascript/typescript in general.



My code looks like this:



function ObjectHandlerUser(perustiedot: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org);

}
function parsealayksikot(obj: any, orgid: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};

}
else {
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};


}

}
}


And my getUser function looks like this:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);

if (!userData) {
return res.status(500).send("Permission denied");
}
else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
}


If anyone is able to help me that would be greatly appreciated!



Thanks in advance!
/V



EDIT: I managed to finally get it to work by using callbacks, however if anyone knows how to do this with promises I would be glad to understand how. My working code looks like this now:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);


if (!userData) {
return res.status(500).send("Permission denied");
}
else {
oh.ObjectHandlerUser(userData, function(result: any) {
console.log(result);
res.status(200).json(
result
);
});
}
}


function ObjectHandlerUser(perustiedot: any, callback: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org, callback);

}
function parsealayksikot(obj: any, orgid: any, callbacker: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
const orgall = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgall);

}
else {
const orgallx = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgallx);


}

}
}









share|improve this question
























  • edited with working solution
    – madvic
    Nov 9 at 12:50















up vote
0
down vote

favorite












I'm currently working on an API route that returns the user data for the person that is logged in, I'm combining this data to other stuff that is already stored in my redis middleware. My Objecthandler is working fine but I cannot seem to complete the full scope since my actually getUserData function that is intended to show the object as an API response just returns undefined, even though my object handler can log the correct data. This leads me to believe that I have some problems with the async aspects of nodejs, Im trying to figure out how to solve this, I did not manage it with callbacks and I can't seem to figure out how to use promises either since I am relatively new to nodejs and javascript/typescript in general.



My code looks like this:



function ObjectHandlerUser(perustiedot: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org);

}
function parsealayksikot(obj: any, orgid: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};

}
else {
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};


}

}
}


And my getUser function looks like this:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);

if (!userData) {
return res.status(500).send("Permission denied");
}
else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
}


If anyone is able to help me that would be greatly appreciated!



Thanks in advance!
/V



EDIT: I managed to finally get it to work by using callbacks, however if anyone knows how to do this with promises I would be glad to understand how. My working code looks like this now:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);


if (!userData) {
return res.status(500).send("Permission denied");
}
else {
oh.ObjectHandlerUser(userData, function(result: any) {
console.log(result);
res.status(200).json(
result
);
});
}
}


function ObjectHandlerUser(perustiedot: any, callback: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org, callback);

}
function parsealayksikot(obj: any, orgid: any, callbacker: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
const orgall = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgall);

}
else {
const orgallx = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgallx);


}

}
}









share|improve this question
























  • edited with working solution
    – madvic
    Nov 9 at 12:50













up vote
0
down vote

favorite









up vote
0
down vote

favorite











I'm currently working on an API route that returns the user data for the person that is logged in, I'm combining this data to other stuff that is already stored in my redis middleware. My Objecthandler is working fine but I cannot seem to complete the full scope since my actually getUserData function that is intended to show the object as an API response just returns undefined, even though my object handler can log the correct data. This leads me to believe that I have some problems with the async aspects of nodejs, Im trying to figure out how to solve this, I did not manage it with callbacks and I can't seem to figure out how to use promises either since I am relatively new to nodejs and javascript/typescript in general.



My code looks like this:



function ObjectHandlerUser(perustiedot: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org);

}
function parsealayksikot(obj: any, orgid: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};

}
else {
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};


}

}
}


And my getUser function looks like this:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);

if (!userData) {
return res.status(500).send("Permission denied");
}
else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
}


If anyone is able to help me that would be greatly appreciated!



Thanks in advance!
/V



EDIT: I managed to finally get it to work by using callbacks, however if anyone knows how to do this with promises I would be glad to understand how. My working code looks like this now:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);


if (!userData) {
return res.status(500).send("Permission denied");
}
else {
oh.ObjectHandlerUser(userData, function(result: any) {
console.log(result);
res.status(200).json(
result
);
});
}
}


function ObjectHandlerUser(perustiedot: any, callback: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org, callback);

}
function parsealayksikot(obj: any, orgid: any, callbacker: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
const orgall = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgall);

}
else {
const orgallx = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgallx);


}

}
}









share|improve this question















I'm currently working on an API route that returns the user data for the person that is logged in, I'm combining this data to other stuff that is already stored in my redis middleware. My Objecthandler is working fine but I cannot seem to complete the full scope since my actually getUserData function that is intended to show the object as an API response just returns undefined, even though my object handler can log the correct data. This leads me to believe that I have some problems with the async aspects of nodejs, Im trying to figure out how to solve this, I did not manage it with callbacks and I can't seem to figure out how to use promises either since I am relatively new to nodejs and javascript/typescript in general.



My code looks like this:



function ObjectHandlerUser(perustiedot: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org);

}
function parsealayksikot(obj: any, orgid: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};

}
else {
return {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};


}

}
}


And my getUser function looks like this:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);

if (!userData) {
return res.status(500).send("Permission denied");
}
else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
}


If anyone is able to help me that would be greatly appreciated!



Thanks in advance!
/V



EDIT: I managed to finally get it to work by using callbacks, however if anyone knows how to do this with promises I would be glad to understand how. My working code looks like this now:



function getUser(req: Request, res: Response, next: NextFunction) {

const userData = authService.getUserData(req.headers);


if (!userData) {
return res.status(500).send("Permission denied");
}
else {
oh.ObjectHandlerUser(userData, function(result: any) {
console.log(result);
res.status(200).json(
result
);
});
}
}


function ObjectHandlerUser(perustiedot: any, callback: any) {
const org = perustiedot.organisaatio;
getrediscallback("getAlayksikot", getdata);
function getdata(reply: any) {
const alayksikot: object = [
];
alayksikot.push(reply);
parsealayksikot(alayksikot, org, callback);

}
function parsealayksikot(obj: any, orgid: any, callbacker: any) {
const yarray: object = [
];
const y2017: object = [
];
const y2016: object = [
];
const y2018: object = [
];
const twoeight = {
vuosi: "2018",
yksikot: y2018,
};
const twoseven = {
vuosi: "2017",
yksikot: y2017
};
const twosix = {
vuosi: "2016",
yksikot: y2016
};
obj.map((s: any) => {
s.map((x: any) => {
const match = x.arvo.slice(0, x.arvo.indexOf("-"));
const year = x.arvo.split("-")[1].split("-")[0];
if (orgid === match && year === "2017") {
const y27 = {
arvo: x.arvo,
selite: x.selite,
};
y2017.push(y27);

}
else if (orgid === match && year === "2018") {
const y28 = {
arvo: x.arvo,
selite: x.selite,
};
y2018.push(y28);
}
else if (orgid === match && year != "2017" && year != "2018") {
const y26 = {
arvo: x.arvo,
selite: x.selite,
};
y2016.push(y26);
}
});
});
const visibleFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisuvuodenlisatieto",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"orcid",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"volyymi",
"numero",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"taiteenala",
"taidealantyyppikategoria",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite",
"emojulkaisunnimi",
"emojulkaisuntoimittajat",
"sivut",
"artikkelinumero",
"julkaisunkustannuspaikka",
"avainsanat",
"julkaisumaa",
"julkistamispaikkakunta",
"tapahtumanlisatieto",
"julkaisunkieli",
"doitunniste",
"muutunniste",
"pysyvaverkkoosoite",
"tekijanrooli",
"lisatieto"
];
const requiredFields = [
"etunimet",
"sukunimi",
"julkaisutyyppi",
"julkaisuvuosi",
"julkaisunnimi",
"tekijat",
"julkaisuntekijoidenlukumaara",
"organisaatiotekija",
"konferenssinvakiintunutnimi",
"isbn",
"issn",
"lehdenjulkaisusarjannimi",
"kustantaja",
"julkaisunkansainvalisyys",
"tieteenala",
"tieteenalakoodi",
"kansainvalinenyhteisjulkaisu",
"yhteisjulkaisuyrityksenkanssa",
"avoinsaatavuus",
"julkaisurinnakkaistallennettu",
"rinnakkaistallennetunversionverkkoosoite"
];
yarray.push(twoeight);
yarray.push(twoseven);
yarray.push(twosix);
if (y2016 && y2017 && y2018 && y2017.length || y2018.length || y2017.length) {
visibleFields.push("alayksikko");
requiredFields.push("alayksikko");
const orgall = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgall);

}
else {
const orgallx = {
perustiedot,
alayksikot: yarray,
visibleFields,
requiredFields
};
callbacker(orgallx);


}

}
}






node.js typescript asynchronous






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 9 at 12:50

























asked Nov 9 at 12:33









madvic

257




257












  • edited with working solution
    – madvic
    Nov 9 at 12:50


















  • edited with working solution
    – madvic
    Nov 9 at 12:50
















edited with working solution
– madvic
Nov 9 at 12:50




edited with working solution
– madvic
Nov 9 at 12:50












1 Answer
1






active

oldest

votes

















up vote
0
down vote













Instead of using callback, you can use async/await to do what you want.
They will make the function wait for the promise to solve in order to continue executing.



// In order to use await, you must begin your function with async
async function getUser(req: Request, res: Response, next: NextFunction) {
// Since you need this data in order to continue, you make the function wait
// for this data to be ready, using await.
const userData = await authService.getUserData(req.headers);

if (!userData) {
return res.status(500).send("Permission denied");
} else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
}


If you want to use Promises you could do something like this:



function getUser(req: Request, res: Response, next: NextFunction) {
// The 'then' function get the response of the promise as the first parameter
// in this case, the 'data' parameter
authService.getUserData(req.headers).then(function(data) {
const userData = data;
if (!userData) {
return res.status(500).send("Permission denied");
} else {
res.status(200).json(
oh.ObjectHandlerUser(userData)
);
}
});

}


Documentation on async/await



Documentation on Promise.then()






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53225798%2fcant-access-data-from-api-request-even-though-console-log-shows-it-exists-async%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote













    Instead of using callback, you can use async/await to do what you want.
    They will make the function wait for the promise to solve in order to continue executing.



    // In order to use await, you must begin your function with async
    async function getUser(req: Request, res: Response, next: NextFunction) {
    // Since you need this data in order to continue, you make the function wait
    // for this data to be ready, using await.
    const userData = await authService.getUserData(req.headers);

    if (!userData) {
    return res.status(500).send("Permission denied");
    } else {
    res.status(200).json(
    oh.ObjectHandlerUser(userData)
    );
    }
    }


    If you want to use Promises you could do something like this:



    function getUser(req: Request, res: Response, next: NextFunction) {
    // The 'then' function get the response of the promise as the first parameter
    // in this case, the 'data' parameter
    authService.getUserData(req.headers).then(function(data) {
    const userData = data;
    if (!userData) {
    return res.status(500).send("Permission denied");
    } else {
    res.status(200).json(
    oh.ObjectHandlerUser(userData)
    );
    }
    });

    }


    Documentation on async/await



    Documentation on Promise.then()






    share|improve this answer

























      up vote
      0
      down vote













      Instead of using callback, you can use async/await to do what you want.
      They will make the function wait for the promise to solve in order to continue executing.



      // In order to use await, you must begin your function with async
      async function getUser(req: Request, res: Response, next: NextFunction) {
      // Since you need this data in order to continue, you make the function wait
      // for this data to be ready, using await.
      const userData = await authService.getUserData(req.headers);

      if (!userData) {
      return res.status(500).send("Permission denied");
      } else {
      res.status(200).json(
      oh.ObjectHandlerUser(userData)
      );
      }
      }


      If you want to use Promises you could do something like this:



      function getUser(req: Request, res: Response, next: NextFunction) {
      // The 'then' function get the response of the promise as the first parameter
      // in this case, the 'data' parameter
      authService.getUserData(req.headers).then(function(data) {
      const userData = data;
      if (!userData) {
      return res.status(500).send("Permission denied");
      } else {
      res.status(200).json(
      oh.ObjectHandlerUser(userData)
      );
      }
      });

      }


      Documentation on async/await



      Documentation on Promise.then()






      share|improve this answer























        up vote
        0
        down vote










        up vote
        0
        down vote









        Instead of using callback, you can use async/await to do what you want.
        They will make the function wait for the promise to solve in order to continue executing.



        // In order to use await, you must begin your function with async
        async function getUser(req: Request, res: Response, next: NextFunction) {
        // Since you need this data in order to continue, you make the function wait
        // for this data to be ready, using await.
        const userData = await authService.getUserData(req.headers);

        if (!userData) {
        return res.status(500).send("Permission denied");
        } else {
        res.status(200).json(
        oh.ObjectHandlerUser(userData)
        );
        }
        }


        If you want to use Promises you could do something like this:



        function getUser(req: Request, res: Response, next: NextFunction) {
        // The 'then' function get the response of the promise as the first parameter
        // in this case, the 'data' parameter
        authService.getUserData(req.headers).then(function(data) {
        const userData = data;
        if (!userData) {
        return res.status(500).send("Permission denied");
        } else {
        res.status(200).json(
        oh.ObjectHandlerUser(userData)
        );
        }
        });

        }


        Documentation on async/await



        Documentation on Promise.then()






        share|improve this answer












        Instead of using callback, you can use async/await to do what you want.
        They will make the function wait for the promise to solve in order to continue executing.



        // In order to use await, you must begin your function with async
        async function getUser(req: Request, res: Response, next: NextFunction) {
        // Since you need this data in order to continue, you make the function wait
        // for this data to be ready, using await.
        const userData = await authService.getUserData(req.headers);

        if (!userData) {
        return res.status(500).send("Permission denied");
        } else {
        res.status(200).json(
        oh.ObjectHandlerUser(userData)
        );
        }
        }


        If you want to use Promises you could do something like this:



        function getUser(req: Request, res: Response, next: NextFunction) {
        // The 'then' function get the response of the promise as the first parameter
        // in this case, the 'data' parameter
        authService.getUserData(req.headers).then(function(data) {
        const userData = data;
        if (!userData) {
        return res.status(500).send("Permission denied");
        } else {
        res.status(200).json(
        oh.ObjectHandlerUser(userData)
        );
        }
        });

        }


        Documentation on async/await



        Documentation on Promise.then()







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 9 at 13:06









        André Adriano

        1916




        1916






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53225798%2fcant-access-data-from-api-request-even-though-console-log-shows-it-exists-async%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            鏡平學校

            ꓛꓣだゔៀៅຸ໢ທຮ໕໒ ,ໂ'໥໓າ໼ឨឲ៵៭ៈゎゔit''䖳𥁄卿' ☨₤₨こゎもょの;ꜹꟚꞖꞵꟅꞛေၦေɯ,ɨɡ𛃵𛁹ޝ޳ޠ޾,ޤޒޯ޾𫝒𫠁သ𛅤チョ'サノބޘދ𛁐ᶿᶇᶀᶋᶠ㨑㽹⻮ꧬ꧹؍۩وَؠ㇕㇃㇪ ㇦㇋㇋ṜẰᵡᴠ 軌ᵕ搜۳ٰޗޮ޷ސޯ𫖾𫅀ल, ꙭ꙰ꚅꙁꚊꞻꝔ꟠Ꝭㄤﺟޱސꧨꧼ꧴ꧯꧽ꧲ꧯ'⽹⽭⾁⿞⼳⽋២៩ញណើꩯꩤ꩸ꩮᶻᶺᶧᶂ𫳲𫪭𬸄𫵰𬖩𬫣𬊉ၲ𛅬㕦䬺𫝌𫝼,,𫟖𫞽ហៅ஫㆔ాఆఅꙒꚞꙍ,Ꙟ꙱エ ,ポテ,フࢰࢯ𫟠𫞶 𫝤𫟠ﺕﹱﻜﻣ𪵕𪭸𪻆𪾩𫔷ġ,ŧآꞪ꟥,ꞔꝻ♚☹⛵𛀌ꬷꭞȄƁƪƬșƦǙǗdžƝǯǧⱦⱰꓕꓢႋ神 ဴ၀க௭எ௫ឫោ ' េㇷㇴㇼ神ㇸㇲㇽㇴㇼㇻㇸ'ㇸㇿㇸㇹㇰㆣꓚꓤ₡₧ ㄨㄟ㄂ㄖㄎ໗ツڒذ₶।ऩछएोञयूटक़कयँृी,冬'𛅢𛅥ㇱㇵㇶ𥄥𦒽𠣧𠊓𧢖𥞘𩔋цѰㄠſtʯʭɿʆʗʍʩɷɛ,əʏダヵㄐㄘR{gỚṖḺờṠṫảḙḭᴮᵏᴘᵀᵷᵕᴜᴏᵾq﮲ﲿﴽﭙ軌ﰬﶚﶧ﫲Ҝжюїкӈㇴffצּ﬘﭅﬈軌'ffistfflſtffतभफɳɰʊɲʎ𛁱𛁖𛁮𛀉 𛂯𛀞నఋŀŲ 𫟲𫠖𫞺ຆຆ ໹້໕໗ๆทԊꧢꧠ꧰ꓱ⿝⼑ŎḬẃẖỐẅ ,ờỰỈỗﮊDžȩꭏꭎꬻ꭮ꬿꭖꭥꭅ㇭神 ⾈ꓵꓑ⺄㄄ㄪㄙㄅㄇstA۵䞽ॶ𫞑𫝄㇉㇇゜軌𩜛𩳠Jﻺ‚Üမ႕ႌႊၐၸဓၞၞၡ៸wyvtᶎᶪᶹစဎ꣡꣰꣢꣤ٗ؋لㇳㇾㇻㇱ㆐㆔,,㆟Ⱶヤマފ޼ޝަݿݞݠݷݐ',ݘ,ݪݙݵ𬝉𬜁𫝨𫞘くせぉて¼óû×ó£…𛅑הㄙくԗԀ5606神45,神796'𪤻𫞧ꓐ㄁ㄘɥɺꓵꓲ3''7034׉ⱦⱠˆ“𫝋ȍ,ꩲ軌꩷ꩶꩧꩫఞ۔فڱێظペサ神ナᴦᵑ47 9238їﻂ䐊䔉㠸﬎ffiﬣ,לּᴷᴦᵛᵽ,ᴨᵤ ᵸᵥᴗᵈꚏꚉꚟ⻆rtǟƴ𬎎

            Why https connections are so slow when debugging (stepping over) in Java?