EDIT **
Хорошо, так что я смог заставить работать параметры благодаря предоставленному первому ответу, но теперь у меня есть проблема, из-за которой моя функция полностью создает нового пользователя в Firebase, а не обновляет существующего, uid, который я передаю в auth.admin.updateUser - это имя пользователя, чей адрес я хочу обновить. Вот обновленная облачная функция, которая добавляет нового пользователя вместо обновления существующего:
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, но она не выполняет то, что я намеревался сделать.
ОРИГИНАЛЬНЫЙ ПОЧТА **
У меня возникли некоторые трудности при работе облачной функции при вызове функции из моего кода флаттера. У меня проблема в том, что поля 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, они не устанавливаются в функции, есть ли что-то, что я делаю здесь неправильно?