为什么我的嵌套承诺会返回未定义的?

这是我的代码:


resolve: async (

        _root,

        { data: { password, interests, email, ...userData } },

        { prisma }

      ) => {

        console.log('called reg');

        const handleError = (error) => {

          console.log('error: ', error);

          return { token: null, error, userId: null };

        };

        return admin

          .auth()

          .createUser({

            email,

            password,

            displayName: `${userData.firstName} ${userData.lastName}`,

          })

          .then((userRecord) => {

            // See the UserRecord reference doc for the contents of userRecord.

            console.log('Successfully created new user:', userRecord);

            return admin

              .database()

              .ref('users/' + userRecord.uid)

              .set(

                {

                  ...userData,

                  interests,

                },

                (error) => {

                  if (error) return handleError(error);

                  else {

                    return admin

                      .auth()

                      .createCustomToken(userRecord.uid)

                      .then((token) => {

                        console.log('token: ', token)

                        return {

                          token,

                          error: null,

                          userId: userRecord.uid,

                        };

                      }, handleError);

                  }

                }

              );

          }, handleError)

          .then((result) => {

            console.log('result: ', result);

            return result;

          });

      },

我在我的 graphql 解析器中使用嵌套,我的问题是,为什么最后一个结果然后返回未定义?我无法弄清楚,因为当我登录createCustomToken的回调时,令牌就在那里,所以我确保最终记录结果,但不幸的是,它是未定义的,基本上,我想使用.then并像这样捕获,而不是asyc /await,帮助?


天涯尽头无女友
浏览 81回答 1
1回答

Helenr

不应在方法中使用回调,而应将 a 链接到该方法。使用回调时,该方法将返回随后在最后一个块中分配给的回调。火基文档setthensetundefinedresultthen此外,您不必在每个方法中都提供相同的参数。您可以通过在最后链接方法来替换它们。handleErrorthencatch...return admin  .database()  .ref("users/" + userRecord.uid)  .set({    ...userData,    interests,  })  .then(() => admin.auth().createCustomToken(userRecord.uid))  .then((token) => {    console.log("token: ", token);    return {      token,      error: null,      userId: userRecord.uid,    };  })  .then((result) => {    console.log("result: ", result);    return result;  }).catch(handleError);在我看来,你的代码很难阅读。编写更具可读性的代码将使调试过程更容易,通常,异步/等待可以提高可读性。async/await您的代码版本:async (  _root,  { data: { password, interests, email, ...userData } },  { prisma }) => {  try {    const userRecord = await admin.auth().createUser({      email,      password,      displayName: `${userData.firstName} ${userData.lastName}`,    });    console.log("Successfully created new user:", userRecord);    await admin      .database()      .ref("users/" + userRecord.uid)      .set({        ...userData,        interests,      });    const token = await admin.auth().createCustomToken(userRecord.uid);    console.log("token: ", token);    return {      token,      error: null,      userId: userRecord.uid,    };  } catch (error) {    console.log("error: ", error);    return { token: null, error, userId: null };  }};当然,可读性是主观的。选择一种你和你的队友喜欢的风格。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript