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 代码返回任何内容。
一般来说,你不应该在你的代码中混用 then
和 await
,因为它很快就会导致这样的错误。
一个简单的解决方法是去掉 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(),
};
});
如果之前有人问过这个问题,我深表歉意,但我发现的所有内容都是 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 代码返回任何内容。
一般来说,你不应该在你的代码中混用 then
和 await
,因为它很快就会导致这样的错误。
一个简单的解决方法是去掉 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(),
};
});