Облачные функции для Firebase: "400, изменение типа триггера функции или поставщика событий не допускается"

Когда я бегу firebase-deploy Я получаю это сообщение об ошибке:

functions: HTTP Error: 400, Change of function trigger type or event provider is not allowed

В моем контроллере под onAuthStateChanged Я собираю user.uid и затем обновите его до базы данных, когда пользователь входит в систему. Этот код работает нормально:

firebase.auth().onAuthStateChanged(function(user) { // this runs on login
  if (user) { // user is signed in
    console.log("User signed in!");
    $scope.authData = user;
    firebase.database().ref('userLoginEvent').update({'user': user.uid}); // update Firebase database to trigger Cloud Function to get a new IBM Watson token
  } // end if user is signed in
  else { // User is signed out
    console.log("User signed out.");
  }
});

Вот моя облачная функция. Он предназначен для запуска при входе пользователя, который обновляет местоположение в базе данных Firebase. Затем функция отправляет HTTP-запрос в IBM Watson для получения токена, а затем записывает токен в файл. Функция работает правильно с узла. Триггер, кажется, проблема.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');

admin.initializeApp(functions.config().firebase);

exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in

  var username = 'groucho',
      password = 'swordfish',
      url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';

  request({url: url}, function (error, response, body) {

    var tokenService = "app.value('watsonToken','" + body + "');";

    fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
      if (err) throw err;
        console.log('The file has been saved!');
    }); // close fs.writeFile

  }); // close request

}); // close getWatsonToken

4 ответа

Решение

Решением этой проблемы является комментирование или отключение вашей функции, а затем сохранение файла функций и его развертывание. Функция будет удалена в Firebase, но после этого вы можете вставить / раскомментировать свою функцию, и она снова будет нормально развернута. Эта ошибка возникает, когда вы берете функцию и изменяете тип триггера, который она использует, то есть HTTP, базу данных или аутентификацию.

Сначала вырежьте

/* exports.yourFunction = someTrigger... */

А затем, после развертывания ("развертывание firebase"), замените ваш триггер

exports.yourFunction = anotherTrigger...

Это может быть легче сделать с помощью functions:delete команда:

firebase functions:delete yourFunction

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

Для тех, кто наткнется на это в будущем, консоль Cloud Functions теперь предлагает кнопку удаления.

Вы также можете перейти на панель "Облачные функции" в консоли Google Cloud Platform и удалить свою функцию оттуда. После этого вы можете загрузить функцию в обычном режиме из Firebase CLI. Не уверен, почему у них нет функции удаления в консоли Firebase.

Более того, теперь у вас есть возможность скопировать существующую функцию в консоли Google. Вам нужно только изменить имя и раздел триггера, все остальное будет таким же, как и старая функция.