Node.js 即使console.log显示数据存在,也无法从API请求访问数据(异步)

Node.js 即使console.log显示数据存在,也无法从API请求访问数据(异步),node.js,typescript,asynchronous,Node.js,Typescript,Asynchronous,我目前正在开发一个API路由,该路由返回登录用户的用户数据,我正在将这些数据与我的redis中间件中已经存储的其他数据相结合。我的Objecthandler工作正常,但我似乎无法完成整个作用域,因为我的实际getUserData函数旨在将对象显示为API响应,它只返回未定义的,即使我的对象处理程序可以记录正确的数据。这让我相信我在nodejs的异步方面遇到了一些问题,我正在尝试解决这个问题,我没有通过回调来管理它,而且我似乎也不知道如何使用承诺,因为我对nodejs和javascript/typ

我目前正在开发一个API路由,该路由返回登录用户的用户数据,我正在将这些数据与我的redis中间件中已经存储的其他数据相结合。我的Objecthandler工作正常,但我似乎无法完成整个作用域,因为我的实际getUserData函数旨在将对象显示为API响应,它只返回未定义的,即使我的对象处理程序可以记录正确的数据。这让我相信我在nodejs的异步方面遇到了一些问题,我正在尝试解决这个问题,我没有通过回调来管理它,而且我似乎也不知道如何使用承诺,因为我对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
                  };


            }

 }
}
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)
      );
    }
  });

}
我的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)
    );
 }
}
如果有人能帮助我,我将不胜感激

提前谢谢! /五

编辑:我最终通过使用回调实现了它,但是如果有人知道如何通过承诺实现这一点,我很乐意理解如何实现。我现在的工作代码如下所示:

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);


            }

 }
}

您可以使用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)
    );
  }
}
如果你想使用承诺,你可以这样做:

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
                  };


            }

 }
}
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)
      );
    }
  });

}


使用工作解决方案编辑