我目前正在使用API路由,该路由返回已登录人员的用户数据,我正在将该数据与已经存储在我的Redis中间件中的其他数据进行组合。我的对象处理程序工作正常,但我似乎无法完成全部范围,因为实际上我打算将对象显示为API响应的getUserData函数返回未定义,即使我的对象处理程序可以记录正确的数据也是如此。这使我相信,nodejs的异步方面存在一些问题,我试图找出解决方案的方法,我没有通过回调进行管理,而且自从我似乎也无法弄清楚如何使用promise一般而言,对于nodejs和javascript / typescript来说是相对较新的。
我的代码如下:
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
};
}
}
}
我的getUser函数如下所示:
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)
);
}
}
如果有人能够帮助我,将不胜感激!
提前谢谢! / V
编辑:我终于通过使用回调使它正常工作,但是,如果有人知道如何用诺言做到这一点,我将很高兴了解它。我的工作代码现在看起来像这样:
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);
}
}
}
答案 0 :(得分:1)
您可以使用async / await来执行所需的操作,而不是使用回调。 他们将使函数等待应许解决,以便继续执行。
// 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)
);
}
}
如果要使用Promises,可以执行以下操作:
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)
);
}
});
}