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);
}
}
}
node.js typescript asynchronous
add a comment |
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);
}
}
}
node.js typescript asynchronous
edited with working solution
– madvic
Nov 9 at 12:50
add a comment |
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);
}
}
}
node.js typescript asynchronous
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
node.js typescript asynchronous
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
add a comment |
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
add a comment |
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()
add a comment |
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()
add a comment |
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()
add a comment |
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()
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()
answered Nov 9 at 13:06
André Adriano
1916
1916
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
edited with working solution
– madvic
Nov 9 at 12:50