Firebase ошибка 400

While I run the command firebase deploy I get this error:

i deploying functions

i functions: ensuring necessary APIs are enabled…

i runtimeconfig: ensuring necessary APIs are enabled…

✔ runtimeconfig: all necessary APIs are enabled

✔ functions: all necessary APIs are enabled

i functions: preparing functions directory for uploading…

i functions: packaged functions (4.04 KB) for uploading

✔ functions: functions folder uploaded successfully

i starting release process (may take several minutes)…

i functions: creating function followerNotification…

⚠ functions: failed to create function followerNotification

⚠ functions: HTTP Error: 400, The request has errors

⚠ functions: 1 function(s) failed to be deployed.

Functions deploy had errors. To continue deploying other features (such as >database), run:
firebase deploy —except functions

Error: Functions did not deploy properly.

Having trouble? Try firebase deploy —help

Everything else works without problems. Only when I trying to make something with Firebase Firestore.

asked Oct 18, 2017 at 19:48

Loyal's user avatar

This was happening to me too, then I realized that at the 2nd level, firestore only allows documents and not collections.

I was attempting to listen to this path:

/collection/document/{wildcard}

You can either do something like

/collection/{wildcard}

or

/collection/document/collection/{wildcard}

answered Oct 23, 2017 at 3:06

Ivan's user avatar

IvanIvan

2,6321 gold badge24 silver badges12 bronze badges

2

I had this problem as well. In my case it was because my trigger path had a trailing slash in the document path.

So changing:

functions.firestore
  .document('some_path/{pushId}/')

To:

functions.firestore
  .document('some_path/{pushId}')

Fixed it it for me. It seems like this is caused by a variety of issues and the firebase cli does not do a good job at explaining the reasons why.

answered Feb 8, 2018 at 22:17

adamduren's user avatar

adamdurenadamduren

3,8171 gold badge14 silver badges10 bronze badges

0

For me none of the answers helped me. In the end I got a list of steps (from Google) to pinpoint the problem. If you run:

firebase --debug --only functions deploy

it will give a more detailed error-message, what was in my case:

HTTP RESPONSE BODY <?xml version='1.0' encoding='UTF-8'?><Error><Code>EntityTooLarge</Code><Message>Your proposed upload is larger than the maximum object size specified in your Policy Document.</Message><Details>Content-length exceeds upper bound on range</Details></Error>

ProgrammingLlama's user avatar

answered Dec 6, 2019 at 7:40

Johan Walhout's user avatar

Johan WalhoutJohan Walhout

1,3963 gold badges22 silver badges38 bronze badges

2

Okej this is what you need to look at.

since you have

exports.yourFunctionName = functions.firestore.document

the thing you need to look at is the .document

Your path MUST point to a document and not to a collection.

so this will not work :

/level1/{level1Id}/level2 <- it points to a collection

this will work :

/level1/{level1Id}/level2/{level2Id}

cloud function will look for when a document has an action

Hope this will help anybody

answered Jul 28, 2019 at 23:55

Cyrus Zei's user avatar

Cyrus ZeiCyrus Zei

2,5491 gold badge25 silver badges37 bronze badges

The problem is that you only reference a collection and not a document like:

exports.myFunctionName = functions.firestore
      .document('users').onWrite((event) => {
        // ... Your code here
      });

You need to reference the document like:

exports.myFunctionName = functions.firestore
  .document('users/marie').onWrite((event) => {
    // ... Your code here
  });

You can also use a wildcard like:

exports.myFunctionName = functions.firestore
  .document('users/{userId}').onWrite((event) => {
    // ... Your code here
  });

It’s described in here: https://firebase.google.com/docs/functions/firestore-events

Hope I could help

answered Oct 21, 2017 at 19:45

Raphael Jenni's user avatar

1

The issue was probably caused by the length of the function name.

So, if the name is:

myFunctionsFromWorksWithCustumersTiggersTests

change for a shorter name, like:

WorkWithCustumers

I hope I helped.

Gibin Ealias's user avatar

Gibin Ealias

2,7415 gold badges20 silver badges39 bronze badges

answered Feb 20, 2018 at 13:25

Mathias Gheno Azzolini's user avatar

1

I had the same error when trying to publish a function listening to a Cloud pub/sub, that began with numerical characters.

exports.nightly_pruning = functions.pubsub.topic('24hr-tick').onPublish((event) => { 
    ... 
});

Fixed it by simply changing the name:

exports.nightly_pruning = functions.pubsub.topic('nightly-tick').onPublish((event) => { 
    ... 
});

(Thanks to Nikolai Hegelstad above. I don’t have the reputation to comment.)

answered Nov 12, 2018 at 2:18

Aidan Davis's user avatar

2

I was also getting the same error until i changed my function name from

create_template_

to

create_new_template

It might be that ‘_'(underscore) at the end of function name resulted in this error.

answered Dec 18, 2018 at 20:47

SHUBHAM SINGH's user avatar

I experienced this because of the underscore at the start of the exports function name. You can test it yourself by trying this:

exports._someLongNameWithUnderscore= functions.auth.user().onCreate(user => {
  return true;
});

exports.someLongNameWithoutUnderscore= functions.auth.user().onCreate(user => {
  return true;
});

exports.shortName= functions.auth.user().onCreate(user => {
  return true;
});

The one with the underscore at the start or end will fail with HTTP:400 and the others will deploy.

answered May 22, 2019 at 19:11

sanjsanj's user avatar

sanjsanjsanjsanj

9738 silver badges20 bronze badges

This can also happen if you’re using the wrong Node version. I just experienced that after setting my node version to 8.x while working on functions. Switched back to v10.x and the issue disappeared.

answered Jun 29, 2019 at 18:55

Mark Flegg's user avatar

Mark FleggMark Flegg

1132 silver badges12 bronze badges

If anybody is still experiencing this, in my case solution was running npm install -g firebase-tools to update cli, and adding

"engines": {
  "node": "8"
}

to package.json

answered Sep 16, 2019 at 13:29

Arda Ilgaz's user avatar

Arda IlgazArda Ilgaz

651 silver badge7 bronze badges

My issue with the same error message was that Cloud Functions’ pubsub doesn’t seem to support topics with names beginning with numeral characters.

answered Jun 18, 2018 at 14:15

Nikolai Hegelstad's user avatar

Just wanted to point out as well that the linter will reject line breaks on listener declaration, ie:

exporst.myFunc = functions.firestore
.document('collection/{uid}')
.onEvent(...)

which the linter doesnt help much and is not covered in documentation (as usual)

answered Dec 18, 2018 at 11:19

Cyrus Talladen's user avatar

Cyrus TalladenCyrus Talladen

1071 gold badge1 silver badge6 bronze badges

На этой странице представлена ​​помощь по устранению неполадок и ответы на часто задаваемые вопросы о распространении и тестировании приложений с помощью App Distribution.

Распространение приложений

Используйте следующие советы для устранения проблем, которые могут возникнуть при распространении приложений среди тестировщиков.

Невозможно распространить приложение из-за отсутствия контактного адреса электронной почты

При загрузке приложения вы можете столкнуться с этой ошибкой:

«Нам не удалось найти контактный адрес электронной почты для приложения <app-id> . Чтобы настроить его, посетите раздел «Распространение приложений» в консоли Firebase».

Установите контактный адрес электронной почты в консоли Firebase, если он доступен. Если проблема не устранена, обратитесь в службу поддержки Firebase .

При подготовке приложения произошла ошибка (ошибки 400, 409 или 500 ).

Если во время подготовки вы постоянно сталкиваетесь с ошибками 400, 409 или 500, обратитесь в службу поддержки Firebase . Предоставьте службе поддержки номер своего проекта Firebase и идентификатор приложения.

Не удалось загрузить IPA

Ниже приведен пример ответа сети браузера:

{
"status": "IN_PROGRESS",
  "message": "There was an error processing your
distribution. Ensure you are uploading a valid IPA or APK and try again."
}

Чтобы решить эту проблему, выполните следующие действия.

  1. Проверьте размер IPA. Максимальный размер файла для всех двоичных файлов составляет 2048 МБ, что составляет немногим более 2 ГБ.

  2. Если размер IPA находится в пределах ограничения размера файла и воспроизводим, выполните следующие действия:

    1. Проверьте файл Info.plist и убедитесь, что CFBundleDisplayName содержит какие-либо разделители <array> .

    2. Удалите разделители <array> и перестройте приложение. Загрузка должна пройти успешно.

    3. Если у вас по-прежнему возникают проблемы, обратитесь в службу поддержки Firebase .

  3. Если размер IPA превышает предельный размер файла, внесите необходимые изменения, чтобы уменьшить размер файла.

  4. Если уменьшение размера файла IPA не решает проблему, обратитесь в службу поддержки Firebase и спросите об использовании Testflight .

Установка и тестирование приложений

Используйте следующие советы для устранения проблем, с которыми ваши тестировщики могут столкнуться при установке и тестировании ваших приложений.

У тестировщика нет учетной записи Google

Когда пользователь создает учетную запись Google, он автоматически получает адрес Gmail.

Если у тестировщика нет Google Workspace или адреса Gmail, или если он предпочитает использовать другой адрес электронной почты для входа, попросите тестировщика связать адрес электронной почты, отличный от Gmail, с учетной записью и использовать этот адрес электронной почты для входа.

При выборе альтернативного адреса электронной почты тестер должен следовать следующим рекомендациям:

  • Не используйте адрес Gmail.
  • Не используйте адрес электронной почты, который уже связан с другой учетной записью Google.
  • Не забудьте использовать пароль своей учетной записи Google при входе с этим адресом электронной почты.

Дополнительную информацию см. в разделе Вход в аккаунт Google с другим адресом электронной почты .

Тестировщик не может увидеть нужные приложения или сборки

Если тестер принял приглашение по электронной почте с адресом электронной почты, отличным от того, на который было отправлено приглашение, тестер может не увидеть нужные приложения или сборки.

Электронное письмо, на которое разработчик отправляет приглашения и которое добавляет к новым сборкам (электронное письмо A), может отличаться от электронного письма, которое тестировщик использует для принятия приглашения (электронное письмо B). Это создает связь за кулисами. Всякий раз, когда электронная почта А добавляется к новым сборкам, на самом деле электронная почта Б получает доступ.

Если тестер принял приглашение по электронной почте с другим адресом электронной почты, выполните следующие действия, чтобы решить проблему:

  1. Удалите тестера из раздела «Просмотреть всех тестировщиков» на вкладке «Тестеры и группы» на странице «Распространение приложений» в консоли Firebase. Существующие приглашения удаляются.

  2. Повторно пригласите тестировщика для тестирования вашего приложения. Тестировщик должен получить приглашение по электронной почте.

  3. Убедитесь, что тестер принимает приглашение с тем же адресом электронной почты.

Тестер не получает уведомления по электронной почте

Тестировщики могут не получать уведомления по электронной почте в следующих случаях:

  • Уведомления по электронной почте отправляются в папки со спамом.

  • Установлены фильтры электронной почты.

  • Приглашение было отправлено на одну учетную запись электронной почты, но тестер принял ее с другой учетной записи электронной почты. Тестировщик получает новые сообщения электронной почты о выпуске для учетной записи электронной почты, на которую изначально было отправлено приглашение.

  • Тестировщик был ранее приглашен, но не принял первоначальное приглашение. Если тестировщик будет добавлен в последующие выпуски, App Distribution не будет автоматически отправлять уведомления о выпуске этому тестировщику, поскольку тестер не принял первоначальное приглашение.

Решение 1

  1. Попросите тестировщика проверить свою папку со спамом и все фильтры электронной почты, которые они установили в своей службе электронной почты.

  2. Если тестер отписался от электронных писем, попросите его сделать следующее:

    1. Найдите электронное письмо, которое тестировщик ранее получил от приложения.
    2. Нажмите «Управление настройками электронной почты» внизу и нажмите «Разрешить повторную подписку на электронные письма ».

Решение 2

  1. Удалите тестера из раздела «Просмотреть всех тестировщиков» на вкладке «Тестеры и группы» на странице «Распространение приложений» в консоли Firebase. Это действие удаляет существующие приглашения.

  2. Повторно пригласите тестировщика для тестирования вашего приложения. Тестировщик должен получить приглашение по электронной почте. Убедитесь, что тестер принимает приглашение с тем же адресом электронной почты, на который было отправлено приглашение.

Ошибка «Ненадежный корпоративный разработчик» при попытке запустить тестовое приложение

Ошибка Untrusted Enterprise Developer появляется, если вы не доверяли сертификату разработчика на тестовом устройстве перед открытием приложения. В приложении «Настройки» > «Профили и управление устройствами» выберите имя разработчика приложения и доверьтесь ему.

Ошибка «Требуется режим разработчика» при попытке запустить тестовое приложение

Ошибка «Требуется режим разработчика» появляется, когда вы пытаетесь запустить специально подготовленное приложение для iOS на iOS 16 или более поздней версии без предварительного включения режима разработчика.

Чтобы включить режим разработчика и устранить эту ошибку, выполните следующие действия:

  1. На iPhone откройте приложение «Настройки» и нажмите «Конфиденциальность и безопасность» .
  2. Прокрутите вниз до раздела «Безопасность» и коснитесь «Режим разработчика» .
  3. Коснитесь ползунка «Режим разработчика» .
  4. Коснитесь «Перезагрузить» .
  5. После перезагрузки устройства разблокируйте устройство. Включить режим разработчика? появится диалоговое окно.
  6. Коснитесь «Включить» . Теперь вы можете запустить свое приложение и начать тестирование.

«Устройство зарегистрировано, все готово! Вы получите электронное письмо, когда приложение будет готово к тестированию»

Если вы устанавливаете дистрибутив Ad Hoc, это сообщение появляется, когда разработчик еще не настроил свое приложение для запуска на вашем тестовом устройстве. Чтобы сделать приложение доступным для вас, разработчик должен выполнить инструкции в разделе Регистрация дополнительных устройств .

У учетной записи Google нет доступа к тестовому приложению

Если у вашей учетной записи Google нет доступа к тестовому приложению, которое вы ранее установили (или приняли приглашение), вероятно, вы вошли в неправильную учетную запись Google. Приложения, к которым у вас есть доступ, связаны с учетной записью Google, которую вы использовали, когда впервые приняли приглашение протестировать приложение. Повторите попытку, войдя в учетную запись Google, которую вы ранее использовали для принятия приглашения.

Ошибка 403: «Обратитесь к администратору для доступа»

Когда вы сталкиваетесь с ошибкой 403, это означает, что используемая вами учетная запись не имеет разрешения на установку и тестирование приложений. Доступ определяется администратором домена вашей учетной записи в Google Workspace.

Если вы считаете, что у вас должно быть разрешение на установку и тестирование приложений, попросите администратора учетной записи Google Workspace изменить настройки вашей учетной записи. Ваш администратор должен следовать инструкциям в разделе Управление доступом к службам, которые не контролируются индивидуально .

Если у вас несколько учетных записей, попробуйте войти в систему с другой учетной записью, которая не имеет ограничений на установку и тестирование приложений.

Включение оповещений в приложении с помощью App Distribution iOS SDK

Воспользуйтесь приведенными ниже советами для устранения неполадок, связанных с включением оповещений о новых сборках в приложениях с помощью App Distribution iOS SDK.

Тестер не получает оповещения в приложении

Если вы уже настроили iOS SDK для распространения приложений в своем приложении, а ваши тестировщики не получают оповещения в приложении, убедитесь, что ваше приложение загружает новые выпуски:

  1. Включите режим отладки в своем приложении. Чтобы узнать, как это сделать, см. документацию Google Analytics .

  2. Запустите приложение в симуляторе и найдите строку «[Firebase/AppDistribution]».

  3. Убедитесь, что тестер имеет доступ к новому релизу:

    • Если возвращается действительный объект выпуска, вероятно, существует проблема в жизненном цикле контроллера представления, из-за которой диалоговое окно предупреждения загружается до появления представления.

    • Если выпуск не возвращается, возможно, ваш тестер еще не связан с новым выпуском. На панели управления App Distribution консоли Firebase убедитесь, что ваш тестер включен в дистрибутив сборки и находится в состоянии Accepted .

      Если ваш тестер по-прежнему не получает обновления, попросите его следовать приведенным ниже советам, чтобы убедиться, что он принял приглашение протестировать ваше приложение и правильно настроил свое тестовое устройство:

      1. На тестовом устройстве войдите в веб-клип Firebase App Distribution. Не забудьте выбрать учетную запись Google, которую вы впервые использовали, когда приняли приглашение протестировать приложение.

      2. Убедитесь, что новая версия приложения доступна в веб-клипе.

Тестировщику предлагается снова войти в систему после закрытия приложения

По умолчанию вашим тестировщикам нужно войти в свою учетную запись Google только один раз, чтобы включить оповещения о новых сборках и установить новые сборки. Если вашим тестировщикам предлагается снова войти в систему после закрытия и повторного открытия вашего приложения, следуйте этим советам, чтобы убедиться, что ваша конфигурация распространения приложений настроена правильно:

  • Убедитесь, что вы включили Firebase App Testers API. Дополнительные сведения см. в разделе Включение API-интерфейса App Distribution Tester .

  • В разделе Основные ограничения убедитесь, что API Firebase App Testers включен в список разрешенных API.

  • Если вы обычно очищаете UserDefaults при выходе из системы, возможно, вы очищаете состояние своего тестера. Приложение App Distribution хранит флаг, указывающий, вошел ли ваш тестер в приложение. Дополнительные сведения см. в репозитории GitHub .

Часто задаваемые вопросы

Есть ли ограничения на добавление тестировщиков в мое приложение?

Распространение приложений Firebase имеет следующие ограничения для тестировщиков:

  • Добавьте не более 500 тестировщиков в проект Firebase.

  • Добавьте не более 200 тестировщиков в группу распространения приложений.

Чтобы добавить больше тестировщиков, запросите бесплатное увеличение лимита .

Срок действия моих приглашений тестировщика истекает?

У тестировщиков есть 30 дней, чтобы принять приглашение протестировать приложение до истечения срока его действия. Когда срок действия приглашения истекает через 5 дней, уведомление об истечении срока действия появляется в консоли Firebase рядом с тестировщиком в выпуске. Приглашение можно продлить, повторно отправив его через раскрывающееся меню в строке тестера.

Когда создается новая версия для загрузки iOS?

См. Регистрация дополнительных устройств .

Как долго доступны выпуски приложений?

Выпуски приложений удаляются из службы распространения приложений, если выполняется одно из следующих условий:

  • Релиз приложения старше 150 дней.
  • Вы превысили ограничение в 1000 выпусков приложений, и выпуск приложения старше, чем 1000 самых последних выпусков приложений.

Дополнительные сведения см. в разделе Распространение приложений поддерживает не более 1000 выпусков .

После того, как приложение достигнет или превысит 150-дневный срок действия или ограничение в 1000 выпусков приложений, выпуск будет удален из панели мониторинга распространения приложений и веб-приложения тестера распространения приложений. Если ваш тестер установил выпуск, локальная версия приложения продолжает работать.

Чтобы версия приложения оставалась доступной дольше, воспользуйтесь одной из следующих рекомендаций:

  • Прежде чем срок действия выпуска приложения истечет или превысит лимит выпусков, загрузите IPA и удалите выпуск с панели управления распространением приложений. Затем повторно загрузите IPA в качестве новой сборки в App Distribution.
  • Загрузите выпуск и загрузите его в облачное хранилище для долгосрочного архивирования.

Релизы приложений истекают через 150 дней.

Когда вы загружаете выпуск своего приложения в Firebase, он отображается на панели управления распространением приложений в течение 150 дней, начиная с даты загрузки. После того как вы загрузите выпуск, вы можете распространить его среди тестировщиков, которые установят выпуск из веб-приложения для тестирования распространения приложений на своем тестовом устройстве.

По истечении 30 дней с даты истечения срока действия выпуска в вашем выпуске на странице распространения приложений консоли Firebase и в веб-приложении тестера распространения приложений появится уведомление об истечении срока действия выпуска приложения.

Распространение приложений поддерживает не более 1000 выпусков.

Распространение приложений позволяет выпускать не более 1000 выпусков для каждого приложения. Когда ваше приложение достигает предела в 1000 выпусков приложений, служба распространения приложений автоматически удаляет самые старые выпуски сверх этого ограничения.

Если вы хотите вручную управлять выпусками приложений, используйте REST API распространения приложений, чтобы составить список и массово удалить выпуски приложений.

Если у вас есть вопросы, обратитесь в службу поддержки Firebase .

Что такое профиль Firebase?

Профиль Firebase — это профиль конфигурации, который позволяет распределению приложений:

  • Зарегистрируйте тестовое устройство, собрав уникальный идентификатор устройства (UDID). Если вы тестируете дистрибутив Ad Hoc, Firebase отправляет разработчику приложения электронное письмо, содержащее UDID тестового устройства, а также инструкции о том, как включить устройство в профиль подготовки приложения, чтобы сборку можно было протестировать на вашем устройстве.

  • Установите веб-клип Firebase App Distribution на главный экран вашего устройства. Веб-клип позволяет вам устанавливать и получать доступ ко всем вашим тестовым приложениям в одном месте. Новые сборки, которые вы приглашены для тестирования, автоматически добавляются в веб-клип.

Справку по установке профилей конфигурации на устройстве iOS см. в документации Apple .

Как я могу получить доступ к тестовым приложениям, установленным на моем устройстве?

Если вы тестировщик, вы можете получить доступ ко всем своим тестовым приложениям с помощью веб-клипа Firebase App Distribution , который автоматически добавляется на главный экран вашего тестового устройства при установке профиля Firebase. Если вы тестируете дистрибутив Ad Hoc, вы должны сначала установить профиль, прежде чем сможете тестировать приложение.

Если вы тестируете дистрибутив Enterprise, вы можете вручную установить профиль:

  1. Если вы еще этого не сделали, войдите в Google и примите приглашение.

  2. В разделе Тестовые приложения выберите приложение, которое хотите протестировать.

  3. В правом верхнем углу страницы приложения нажмите .

  4. Следуйте инструкциям на экране, чтобы установить профиль Firebase.

Как удалить свою учетную запись тестера?

Чтобы удалить свою учетную запись тестера App Distribution и связанные с ней данные, выполните следующие действия по порядку:

  1. Посетите https://appdistribution.firebase.google.com и войдите в свою учетную запись Google.

  2. В правом верхнем углу нажмите ( Управление учетной записью )

    Удалить учетную запись .

  3. Необязательно: в разрешениях вашей учетной записи Google отмените доступ к Firebase App Distribution. Обратите внимание, что отзыв доступа без предварительного удаления вашей учетной записи распространения приложений не приводит к удалению вашей учетной записи тестировщика или данных.

HTTP Error 400, also known as Bad Request error, occurs when there is a problem with the syntax of the request made to the server. When developing Cloud Functions for Firebase Firestore, this error could be caused by a variety of reasons such as incorrect request structure, missing data, or incorrect data format. In this article, we will look at different methods to troubleshoot and fix this error.

Method 1: Verify Request Structure

To fix the HTTP Error 400, The Request has errors in Firebase Firestore Cloud Functions, you can use the «Verify Request Structure» method. This method ensures that the request sent to the Cloud Function has the correct structure and parameters before processing it. Here are the steps to implement this method:

  1. Define the expected request structure in a JSON schema. For example:
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 18 }
  },
  "required": ["name", "age"]
}
  1. Use the ajv library to compile and validate the JSON schema. Install it with:
  1. In your Cloud Function, parse the request body and validate it against the schema using the ajv library. For example:
const Ajv = require('ajv');
const ajv = new Ajv();

exports.myFunction = (req, res) => {
  const data = req.body;
  const schema = {
    "type": "object",
    "properties": {
      "name": { "type": "string" },
      "age": { "type": "integer", "minimum": 18 }
    },
    "required": ["name", "age"]
  };
  const validate = ajv.compile(schema);
  const valid = validate(data);
  if (!valid) {
    res.status(400).send(validate.errors);
    return;
  }
  // process the request...
};
  1. If the request is invalid, return a 400 error response with the validation errors.

That’s it! By using the «Verify Request Structure» method, you can ensure that your Cloud Function receives valid requests and avoid the HTTP Error 400.

Method 2: Check for Missing or Incorrect Data

If you are encountering HTTP Error 400 in Firebase Firestore Cloud Functions, it could be due to missing or incorrect data in your request. Here’s how you can check for missing or incorrect data to fix this error:

Step 1: Parse the Request Body

First, you need to parse the request body to extract the data sent by the client. You can use the body-parser middleware for this purpose. Here’s an example:

const functions = require('firebase-functions');
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

Step 2: Check for Missing or Incorrect Data

Next, you need to check if the required data is present in the request body and if it is in the correct format. You can use the hasOwnProperty method to check if a property exists in an object. Here’s an example:

app.post('/my-endpoint', (req, res) => {
  const { name, email } = req.body;

  if (!req.body.hasOwnProperty('name') || !req.body.hasOwnProperty('email')) {
    return res.status(400).send('Missing required data');
  }

  if (typeof name !== 'string' || typeof email !== 'string') {
    return res.status(400).send('Incorrect data format');
  }

  // Your code here
});

Step 3: Handle Errors

Finally, you need to handle any errors that occur during the processing of the request. You can use the try...catch statement to catch any errors that occur in your code. Here’s an example:

app.post('/my-endpoint', (req, res) => {
  const { name, email } = req.body;

  if (!req.body.hasOwnProperty('name') || !req.body.hasOwnProperty('email')) {
    return res.status(400).send('Missing required data');
  }

  if (typeof name !== 'string' || typeof email !== 'string') {
    return res.status(400).send('Incorrect data format');
  }

  try {
    // Your code here
  } catch (error) {
    console.error(error);
    return res.status(500).send('Internal server error');
  }
});

That’s it! By following these steps, you can check for missing or incorrect data in your Firebase Firestore Cloud Functions and fix HTTP Error 400.

Method 3: Validate Data Format

To fix the «HTTP Error 400, The Request has errors» error in Firebase Firestore Cloud Functions, you can use the «Validate Data Format» method. This method involves validating the data format of the request body before processing it.

Here are the steps to implement this method:

  1. Install the joi package by running the following command:
  1. Import the joi package in your Cloud Function:
const Joi = require('joi');
  1. Define a schema for the expected data format using the joi package:
const schema = Joi.object({
  name: Joi.string().required(),
  age: Joi.number().required(),
  email: Joi.string().email().required(),
});
  1. Validate the request body against the schema using the validate method of the joi package:
exports.myFunction = functions.https.onRequest((req, res) => {
  const result = schema.validate(req.body);
  if (result.error) {
    res.status(400).send(result.error.details[0].message);
    return;
  }

  // Process the request body
  // ...
});

In the above code, if the request body does not match the expected data format, the Cloud Function will return a «HTTP Error 400, The Request has errors» error with the validation error message.

By using the «Validate Data Format» method, you can ensure that the request body is in the correct format before processing it, which can help prevent errors and improve the reliability of your Cloud Function.

Note: This is just an example of how to fix the «HTTP Error 400, The Request has errors» error in Firebase Firestore Cloud Functions with the «Validate Data Format» method. Depending on your specific use case, you may need to modify the code accordingly.

Method 4: Debug using Logs

To debug the HTTP Error 400 issue in Firebase Firestore Cloud Functions, you can use logs to identify the root cause of the error. Here are the steps to debug using logs:

  1. Open the Firebase console and navigate to the Functions section.
  2. Click on the function that is causing the error.
  3. Click on the «Logs» tab to view the logs for the function.
  4. Look for any error messages or stack traces in the logs that indicate the cause of the HTTP Error 400.
  5. Add log statements to your code to help identify the source of the error. For example, you can add the following code to log the request body:
exports.myFunction = functions.https.onRequest((req, res) => {
  console.log('Request Body:', req.body);
  // ...
});
  1. Reproduce the error and check the logs for any new log statements that may help identify the issue.
  2. Once you have identified the issue, make the necessary changes to your code to fix the error.

By using logs to debug your Firebase Firestore Cloud Functions, you can quickly identify and fix any issues that may be causing the HTTP Error 400 error.

Method 5: Consult Firebase Documentation and Community

To fix the HTTP Error 400 in Firebase Firestore Cloud Functions, it is highly recommended to consult the Firebase Documentation and Community. Here are the steps you can follow to resolve the issue:

  1. First, check the request body and make sure it is valid. You can use the body-parser middleware to parse the request body.
const bodyParser = require('body-parser');
app.use(bodyParser.json());
  1. Next, check the function code and make sure it is correct. You can use the Firebase CLI to deploy the function and check for any errors.
firebase deploy --only functions
  1. If the above steps do not solve the issue, check the Firebase Documentation and Community for any similar issues and their solutions. You can also post your issue on the Firebase Community forum to get help from other developers.
// Example function code that may cause HTTP Error 400
exports.myFunction = functions.https.onRequest((req, res) => {
  const data = req.body.data; // incorrect property name
  const result = data * 2;
  res.send(result);
});
// Fixed function code
exports.myFunction = functions.https.onRequest((req, res) => {
  const data = req.body.value; // correct property name
  const result = data * 2;
  res.send(result);
});

By following these steps and consulting the Firebase Documentation and Community, you should be able to fix the HTTP Error 400 issue in Firebase Firestore Cloud Functions.

Attached is the firebase-debug.json logs

[debug] [2020-12-11T15:08:10.210Z] ----------------------------------------------------------------------
[debug] [2020-12-11T15:08:10.212Z] Command:       /Users/me/.nvm/versions/node/v10.22.1/bin/node /Users/me/.nvm/versions/node/v10.22.1/bin/firebase database:instances:create decor-timeandspace --project decor-timeandspace --json --debug
[debug] [2020-12-11T15:08:10.212Z] CLI Version:   8.12.1
[debug] [2020-12-11T15:08:10.212Z] Platform:      darwin
[debug] [2020-12-11T15:08:10.212Z] Node Version:  v10.22.1
[debug] [2020-12-11T15:08:10.213Z] Time:          Fri Dec 11 2020 07:08:10 GMT-0800 (Pacific Standard Time)
[debug] [2020-12-11T15:08:10.213Z] ----------------------------------------------------------------------
[debug] [2020-12-11T15:08:10.213Z]
[debug] [2020-12-11T15:08:10.219Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[debug] [2020-12-11T15:08:10.219Z] > authorizing via signed-in user
[debug] [2020-12-11T15:08:10.221Z] [iam] checking project decor-timeandspace for permissions ["firebase.projects.get","firebasedatabase.instances.create"]
[debug] [2020-12-11T15:08:10.224Z] >>> HTTP REQUEST POST https://cloudresourcemanager.googleapis.com/v1/projects/decor-timeandspace:testIamPermissions
 {"permissions":["firebase.projects.get","firebasedatabase.instances.create"]}
[debug] [2020-12-11T15:08:10.392Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Fri, 11 Dec 2020 15:08:10 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","server-timing":"gfet4t7; dur=55","alt-svc":"h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"","accept-ranges":"none","transfer-encoding":"chunked"}
[debug] [2020-12-11T15:08:10.393Z] >>> HTTP REQUEST GET https://firebase.googleapis.com/v1beta1/projects/decor-timeandspace

[debug] [2020-12-11T15:08:10.579Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Fri, 11 Dec 2020 15:08:10 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"","accept-ranges":"none","transfer-encoding":"chunked"}
[debug] [2020-12-11T15:08:10.580Z] >>> HTTP REQUEST POST https://mobilesdk-pa.googleapis.com/v1/projects/277554221689/databases

[debug] [2020-12-11T15:08:11.001Z] <<< HTTP RESPONSE 400 {"vary":"X-Origin, Referer, Origin,Accept-Encoding","content-type":"application/json; charset=UTF-8","date":"Fri, 11 Dec 2020 15:08:10 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"","accept-ranges":"none","transfer-encoding":"chunked"}
[debug] [2020-12-11T15:08:11.001Z] <<< HTTP RESPONSE BODY {"error":{"code":400,"message":"Precondition check failed.","status":"FAILED_PRECONDITION"}}
[error]
[error] Error: HTTP Error: 400, Precondition check failed.
[debug] [2020-12-11T15:08:11.006Z] Error Context: {
  "body": {
    "error": {
      "code": 400,
      "message": "Precondition check failed.",
      "status": "FAILED_PRECONDITION"
    }
  },
  "response": {
    "statusCode": 400,
    "body": {
      "error": {
        "code": 400,
        "message": "Precondition check failed.",
        "status": "FAILED_PRECONDITION"
      }
    },
    "headers": {
      "vary": "X-Origin, Referer, Origin,Accept-Encoding",
      "content-type": "application/json; charset=UTF-8",
      "date": "Fri, 11 Dec 2020 15:08:10 GMT",
      "server": "ESF",
      "cache-control": "private",
      "x-xss-protection": "0",
      "x-frame-options": "SAMEORIGIN",
      "x-content-type-options": "nosniff",
      "alt-svc": "h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"",
      "accept-ranges": "none",
      "transfer-encoding": "chunked"
    },
    "request": {
      "uri": {
        "protocol": "https:",
        "slashes": true,
        "auth": null,
        "host": "mobilesdk-pa.googleapis.com",
        "port": 443,
        "hostname": "mobilesdk-pa.googleapis.com",
        "hash": null,
        "search": null,
        "query": null,
        "pathname": "/v1/projects/277554221689/databases",
        "path": "/v1/projects/277554221689/databases",
        "href": "https://mobilesdk-pa.googleapis.com/v1/projects/277554221689/databases"
      },
      "method": "POST"
    }
  }
}

I’m trying to deploy cloud function to create push notification (chat messaging) on firebase (Firestore).
But when i’m trying to do this — i’m always getting HTTP Error: 400, The request has errors.
Looks like path of collections is good.

exports.notifyNewMessage = functions.firestore
.document('/chat/{toUserId}/chatRoom/{fromUserId}/chatItems')
.onCreate((docSnapshot, context) => {
    
    const message = docSnapshot.data();
    const recipientId = context.params.toUserId; // получатель сообщения
    const senderId = context.params.fromUserId; // отправитель сообщения
    const senderName = message['username'];
    
    if (recipientId === senderId) {
        
    } else {
        
        
        
        return admin.forestore().doc('tokens/' + recipientId).get().then(userDoc => {
            const tokens = userDoc.get('tokens')
            const notificationBody = (message['type'] === "TEXT") ? message['textMessage'] : "New message with Image"
            const payload = {
                notification: {
                    title: senderName + " sent you a message",
                    body: notificationBody,
                    clickAction: "ChatActivity" // возможно, это только для андроида
                },
            data: {
                USER_NAME: senderName,
                USER_ID: message['senderId']
            }
            }
            
            return admin.messaging().sendToDevice(tokens, payload).then( response => {
                const stillRegisteredTokens = tokens
                
                response.results.forEach((result, index) => {
                    const error = result.error
                    if (error) {
                        const failedRegistrationToken = tokens[index]
                        console.error('failed token', failedRegistrationToken, error)
                        if (error.code === 'messaging/invalid-registration-token' || error.code == 'messaging/registration-token-not-registred') {
                            const failedIndex = stillRegisteredTokens.indexOf(failedRegistrationToken)
                            if (failedIndex > -1) {
                                stillRegisteredTokens.splice(failedIndex, 1)
                            }
                        }
                    }
                })
                
                
                return admin.firestore().doc("tokens" + recipientId).update({
                    tokens: stillRegisteredTokens
                })
                
                
            })
            
        })
        
    }
    
    
})

also i would ask about line «clickAction: «ChatActivity» it only for android? how can i do same to ios?
Thx a lot!

Понравилась статья? Поделить с друзьями:
  • Finereader ошибка при обращении к файлу
  • Finereader ошибка 0xc000007b
  • Finereader код ошибки 1284 finereader
  • Finereader внутренняя программная ошибка map h 352
  • Finereader 15 ошибка нет доступа к файлу fch