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

            Guess what letter conforming each word

            Port of Spain

            Run scheduled task as local user group (not BUILTIN)