Firebase 9 云函数不向 reactjs 应用程序返回数据

Firebase 9 cloud function not returning data to reactjs app

如果之前有人问过这个问题,我深表歉意,但我发现的所有内容都是 2018/2019 年的,似乎对我的问题没有帮助。 我将 Firebase 9 与 Reactjs 应用程序一起使用,并尝试使用 Cloud Functions 从 httpsCallable 函数中的 generatePasswordResetLink 检索 link 。 Cloud Function 工作正常,记录所有正确的值,并做 return 简单的字符串,就像我在数据值中发送的电子邮件一样,但由于某种原因它不会发送回 link 所以我可以将其包含在我将从应用程序发送的电子邮件中。

我的反应函数代码:

const funcUpdPassword = async () => {
    const sendEmail = user['email'];
    const authEmail = user['username'] + '@' + office['domain'];
    const updPassword = httpsCallable(functions, 'updPassword');
    await updPassword({
        dest: sendEmail,
        auth: authEmail,
    }).then((result) => {
        console.log('result data:', result.data);
        const data: any = result.data;
        console.log('data:', data);
    });
};

我的 firebase 函数代码:

exports.updPassword = functions.https.onCall(async (data, context) => {
    const dest = data.dest;
    const auth = data.auth;
    await admin.auth()
        .generatePasswordResetLink(auth)
        .then((link) => {
            console.log('link:', link.toString());
            console.log(`Hello ${dest}`);

            return {
                text: `Hello ${dest}`,
                link: link.toString(),
            };
        });
});

我已经尝试过在两个函数上使用和不使用 async/await,并且在 firebase 函数日志中没有出现错误,但仍然无法将 link 发回。有人可以告诉我为什么以及如何解决这个讨厌的小麻烦吗?谢谢!

您没有从云函数中的 top-level 代码返回任何内容。

一般来说,你不应该在你的代码中混用 thenawait,因为它很快就会导致这样的错误。

一个简单的解决方法是去掉 await 并使用 return:

exports.updPassword = functions.https.onCall((data, context) => {
    const dest = data.dest;
    const auth = data.auth;
    // 
    return admin.auth()
        .generatePasswordResetLink(auth)
        .then((link) => {
            return {
                text: `Hello ${dest}`,
                link: link.toString(),
            };
        });
});

或者您也可以去掉 then:

exports.updPassword = functions.https.onCall(async (data, context) => {
    const dest = data.dest;
    const auth = data.auth;

    const link = await admin.auth().generatePasswordResetLink(auth);
    return {
        text: `Hello ${dest}`,
        link: link.toString(),
    };
});