У меня есть облачная функция Firebase, которая работает (она записывает в мою базу данных от имени администратора, а также проверяет существующую запись с идентификатором строки электронной почты). Моя проблема в том, что он не возвращает данные обратно в клиентское приложение должным образом.
Когда я отслеживаю значение result
, это {data: null}
Я также хотел бы выдать ошибку, если электронное письмо существует, но оно жалуется на необработанное обещание (см. комментарии в коде ниже).
Итак, здесь есть два вопроса. Первая из них самая насущная.
exports.saveData = functions.https.onCall( (data, context) => {
// check if the email exists
admin.database().ref('competition_entries/' + data.compId + '/' + data.emailStringId).once('value').then(function(snapshot) {
if (snapshot.val() == null){
console.info("Writing data to "+data.compId+" : "+data.emailStringId);
let current_datetime = new Date()
let formatted_time = current_datetime.getHours() + ":" + current_datetime.getMinutes() + ":" + current_datetime.getSeconds();
let formatted_date = current_datetime.getDate() + "/" + (current_datetime.getMonth() + 1) + "/" + current_datetime.getFullYear();
let timestamp_string = formatted_time+" "+formatted_date;
console.info(formatted_date)
admin.database().ref('competition_entries/' + data.compId + '/' + data.emailStringId).set({
name: data.name,
email: data.email,
phone: data.phone,
selectedItem: data.selectedItem,
submitted_date: timestamp_string
})
.then(() => {
console.info("success");
return {
"error": "none",
"message": "success"
};
}).catch(function(error) {
throw error;
});
}else{
// email address exists as a data entry so tell the user that they have already submitted
let code = "already-exists";
let message = "Email address already exists";
let details = "A user with the same email address has already entered the competition.";
console.info(message+"/"+details);
/*
TODO: throwing an HttpsError directly here was causing an unresolved promise error. This would be the better way to tell the client that the user has already submitted their data.
*/
// throw error;
//throw new functions.https.HttpsError(code, message, details);
// this resolves the promise error but is a hack
return {
error: new functions.https.HttpsError(code, message, details),
message: message
}
}
}).catch(function(error) {
throw error;
});
});
Я думаю, проблема в ты возвращаешься недостаточно. Функции нуждаются в том, чтобы каждая функция возвращала что-то для успешного выполнения.
Обычно это return true
или return Promise
Так что это должно быть что-то вроде этого:
//check if email exist
return admin.databse...
//If there is no user create it
return.admin...
Код записывает базу данных, но так как это не было возвратом, это происходило асинхронно, и код продолжал выполняться сверху вниз, делая функцию ответа клиенту тарабарщиной.
Вам следует
if (!snapshot)
короткое замыкание лучше, потому что снимок может быть неопределенным, вызывая исключение при проверке, если данные снимка пусты.Моя проблема сейчас в том, что я развернул его и получил проблему CORS. Какие-нибудь советы?
Я только что узнал о добавлении «возврата», но спасибо и за другие советы! Ценить это.