即使console.log显示数据存在,也无法从API请求中访问数据(ASYNC)

时间:2018-11-09 12:33:38

标签: node.js typescript asynchronous

我目前正在使用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);


            }

 }
}

1 个答案:

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

}

Documentation on async/await

Documentation on Promise.then()