编辑**
好的,我已经成功通过第一个答案提供的参数来使我的函数工作,但现在我遇到了一个问题,我的函数正在Firebase中创建一个全新的用户而不是更新一个现有的用户,我传递给auth.admin.updateUser的uid是要更新电子邮件的现有用户的uid。这是更新后的云函数,它正在添加新用户而不是更新现有用户:
exports.updateEmail = functions.https.onCall((data, context) => {
const email = data.email;
const uid = data.uid;
admin.auth().updateUser(uid, {
email: email
})
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log("Successfully updated user", userRecord.toJSON());
return response.status(200).json(userRecord.toJSON());
})
.catch(function(error) {
console.log("Error updating user:", error);
return response.status(404).json({
error: 'Something went wrong.'
});
});
});
我从Firebase文档中得到了该函数,但它没有按照我预期的方式工作。
原帖:
当我从我的Flutter代码中调用云函数时,我遇到了一些困难。我的问题是uid和email字段未定义,尽管我正在使用busboy字段将它们传递给云函数。
我试图像下面这样将email和uid字段传递给函数:
final request = http.MultipartRequest('POST', Uri.parse('****************my function url************'));
request.fields['email'] = Uri.encodeComponent(newEmail);
request.fields['uid'] = Uri.encodeComponent(selectedUser.uid);
request.headers['Authorization'] = 'Bearer ${_authenticatedUser.token}';
final http.StreamedResponse streamedResponse = await request.send();
在 Node.js 端,我正在尝试使用 busboy 来使用这些字段,以下是我的 Node.js 云函数:
exports.changeEmail = functions.https.onRequest((request, response) => {
if (!request.headers.authorization ||
!request.headers.authorization.startsWith('Bearer ')
) {
return response.status(401).json({
error: 'Unauthorized.'
});
}
let idToken;
idToken = request.headers.authorization.split('Bearer ')[1];
let email;
let uid;
const busboy = new Busboy({
headers: request.headers
});
busboy.on('field', (fieldname, value) => {
if (fieldname == 'email') {
email = decodeURIComponent(value);
}
if (fieldname == 'uid') {
uid = decodeURIComponent(value);
}
});
admin.auth().updateUser(uid, {
email: email
})
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log("Successfully updated user", userRecord.toJSON());
return response.status(200).json(userRecord.toJSON());
})
.catch(function(error) {
console.log("Error updating user:", error);
return response.status(404).json({
error: 'Something went wrong.'
});
});
即使我使用 busboy fields 传递了字段,但它们无法在函数中设置,这里有什么我做错了吗?
}
parameters: {"email": "whatever@example.com"}
传递,所以在函数内部它会作为data.email
存在还是需要将data
进行JSON解码然后从中获取email
参数? - Vincenzo