Я пытаюсь вызвать функцию Firebase из моего проекта Flutter. В моем файле pubspec.yaml я импортировал импорт функций: cloud_functions: ^0.4.0+2. Я также настроил все конфигурации firebase, так как у меня есть рабочее соединение с базой данных firestore из моего приложения. Затем я создал и развернул функцию Firebase в javascript следующим образом:
exports.addEventToCalendar = functions.https.onRequest((request, response) =>
const eventData = {
eventName: request.body.eventName,
description: request.body.description,
startTime: request.body.startTime,
endTime: request.body.endTime
};
//more code using these variables
}
Я успешно развернул эту функцию в Firebase и успешно запустил и протестировал ее в консоли разработчика Google со следующими данными JSON:
{
"eventName": "Firebase Event",
"description": "This is a sample description",
"startTime": "2019-07-18T10:00:00",
"endTime": "2019-07-18T14:00:00"
}
Так я знаю, что эта функция работает.
Теперь, когда я пытаюсь вызвать это в своем приложении Flutter, используя этот метод:
void _addToCal() async {
try {
final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
functionName: 'addEventToCalendar',
);
dynamic resp = await callable.call(<String, dynamic>{
"eventName": "Flutter Event",
"description": "This is a sample description",
"startTime": "2019-07-15T10:00:00",
"endTime": "2019-07-15T14:00:00"
});
} catch (e, s) {
print(e);
print(s);
}
}
Я получаю экземпляр ошибки CloudFunctionsException.
Со стороны Firebase я просматриваю журналы функции и вижу несколько ошибок, в том числе: TypeError: Cannot read property 'data' of undefined.
Спасибо за любую помощь, так как я новичок в Firebase и Cloud Functions.





Попробуйте получить данные из вашей функции следующим образом:
const { body } = req;
const eventName = req.query.eventName || body.eventName || (body.data && body.data.eventName);
const description = req.query.description || body.description || (body.data && body.data.description);
const startTime = req.query.startTime || body.startTime || (body.data && body.data.startTime);
const endTime = req.query.endTime || body.endTime || (body.data && body.data.endTime);
const eventData = {
eventName: eventName,
description: description,
startTime: startTime,
endTime: endTime
};
Вы вызываете функцию вызываемый из своего кода Flutter, но вы объявляете обычную функцию, активируемую HTTPS, в вашем index.js. Облачные функции Вызываемый объявлены, как показано здесь:
exports.addMessage = functions.https.onCall((data, context) => { // ... });
Обновили ли вы облачные функции, чтобы считать их параметры из data и context, как показано в документации, на которую я ссылаюсь?
Спасибо, @Frank! Это правильный ответ. Также необходимо добавить функцию возврата в облако, так как объект ответа недоступен.
Когда я изменяю его на это, в моих журналах для функции в Firebase говорится: «Необработанная ошибка TypeError: не удается прочитать свойство «eventName» из неопределенного»?