Google стремится к продвижению расового равенства для чернокожего населения. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Firebase SDK для облачных функций обновления руководства: бета-версии 1.0 или выше

Версия 1.0.0 от Firebase SDK для облачных функций внесла некоторые важные изменения в API. Основное изменение, замена event.data формата с data и context параметров, влияет на все функции асинхронной (не HTTP). Обновленный SDK также может быть использован с firebase-functions-test , блок тестирования компаньона SDK. См Модульное тестирование функций для получения дополнительной информации.

Версия 2.0.0 Firebase SDK для облачных функций представила разрывное изменение для временных меток в Firestore-запускаемых функциях .

Для обновления SDKs до последней версии, выполните следующие действия в функции папки:

 npm install firebase-functions@latest --save
npm install firebase-admin@latest --save-exact
 

Вы должны также обновить Firebase CLI до последней версии:

 npm install -g firebase-tools
 

Изменения SDK , которые влияют на все функции асинхронной (не HTTP)

SDK изменения по типу запуска

Изменения в эмуляции функций

Изменения SDK, которые влияют на все функции фона (не HTTP)

Раскол параметр событий в данные и контекст

По состоянию V 1.0 из Firebase SDK для облачных функций, то event , параметр для асинхронных функций является устаревшим. Он был заменен двумя новыми параметрами: data и context .

data параметр представляет данные , которые вызвали функцию. Поля data параметра определяется типом триггера, и изменяются соответствующим образом . Например, для реального времени базы данных, то data параметр является DataSnapshot . См изменений по типу триггера для получения дополнительной информации о data параметре.

context параметр предоставляет информацию о выполнении функции. Одинаковый по асинхронным типам функций, context содержит поле eventId , timestamp , eventType , resource и params . Кроме того, в реальном времени Функции базы данных предоставляют информацию аутентификации для пользователя, инициировавшего функцию. Вот пример контекстных полей, определенных в функции, вызванной в реальном времени базы данных записи:

 exports.dbWrite = functions.database.ref('/path/with/{id}').onWrite((data, context) => {
  const authVar = context.auth; // Auth information for the user.
  const authType = context.authType; // Permissions level for the user.
  const pathId = context.params.id; // The ID in the Path.
  const eventId = context.eventId; // A unique event ID.
  const timestamp = context.timestamp; // The timestamp at which the event happened.
  const eventType = context.eventType; // The type of the event that triggered this function.
  const resource = context.resource; // The resource which triggered the event.
  // ...
});
 

Новый синтаксис инициализации для firebase-admin

firebase-admin теперь инициализируется без каких - либо параметров в пределах функции Облачные во время выполнения.

До (<= v0.9.1)

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
 

Теперь (> = v1.0.0)

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
 

Обратите внимание , что вы больше не можете пройти в functions.config().firebase при инициализации. Смотрите следующий раздел для получения дополнительной информации о конфигурации доступа в v1.0.0.

functions.config().firebase удалены

functions.config().firebase был удален. Если вы хотите получить доступ к значениям конфигурации из проекта Firebase, используйте process.env.FIREBASE_CONFIG вместо этого:

 let firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG);
/* {  databaseURL: 'https://databaseName.firebaseio.com',
       storageBucket: 'projectId.appspot.com',
       projectId: 'projectId' }
*/
 

SDK изменения по типу запуска

Для многих поддерживаемых функций триггеров, v 1.0 внесены изменения в наименовании для полей данных и методов. В этом разделе перечислены изменения по типу триггера.

в режиме реального времени базы данных

Данные события теперь DataSnapshot

В более ранних версиях event.data был DeltaSnapshot ; от V 1.0 вперед это DataSnapshot .

Для onWrite и onUpdate событий, параметр данных имеет before и after полей. Каждый из них является DataSnapshot с теми же самыми методами , доступными в admin.database.DataSnapshot . Например:

До (<= v0.9.1)

 exports.dbWrite = functions.database.ref('/path').onWrite((event) => {
  const beforeData = event.data.previous.val(); // data before the write
  const afterData = event.data.val(); // data after the write
});
 

Теперь (> = v1.0.0)

 exports.dbWrite = functions.database.ref('/path').onWrite((change, context) => {
  const beforeData = change.before.val(); // data before the write
  const afterData = change.after.val(); // data after the write
});
 

Для onCreate , параметр данных является DataSnapshot , который представляет данные , которые были только что добавили:

До (<= v0.9.1)

 exports.dbCreate = functions.database.ref('/path').onCreate((event) => {
  const createdData = event.data.val(); // data that was created
});
 

Теперь (> = v1.0.0)

 exports.dbCreate = functions.database.ref('/path').onCreate((snap, context) => {
  const createdData = snap.val(); // data that was created
});
 

Для onDelete , параметр данных является DataSnapshot , который представляет данные , которые были просто удалены:

До (<= v0.9.1)

 exports.dbDelete = functions.database.ref('/path').onDelete((event) => {
  const deletedData = event.data.previous.val(); // data that was deleted
});

 

Теперь (> = v1.0.0)

 exports.dbDelete = functions.database.ref('/path').onDelete((snap, context) => {
  const deletedData = snap.val(); // data that was deleted
});
 

Новые свойства для информации Идент.польза

EventContext.auth V1.0.0 представила два новых свойства для доступа к пользовательской информации, в том числе разрешений для пользователя, инициировавшего функцию.

  • EventContext.auth . Содержит информацию , такие как uid и токен аутентификации , прошедшей проверку подлинности пользователя.
  • EventContext.authType . Содержит уровни разрешений, что позволяет обнаружить, является ли пользователь пользователем администратора, например.

Разработчики , использующие недокументированное event.auth поле должны обновить любой связанный код , чтобы использовать эти новые свойства.

adminRef заменен ref

.adminRef ссылка была удалена в пользу .ref ссылки , которые теперь разрешено с правами администратора. Бывший способ использования .ref -как ссылки на изменение уполномоченного в качестве пользователя , который вызвал изменение-больше не поддерживаются.

До (<= v0.9.1)

 exports.dbCreate = functions.database.ref('/path/{uid}').onCreate((event) => {
  const parentRef = event.data.adminRef.parent; // The Database reference to the parent authorized with admin privileges.

  const parentRefAsUser = event.data.ref.parent; // The Database reference to the parent authorized as the user which triggered the change.
});
 

Теперь (> = v1.0.0)

 exports.dbCreate = functions.database.ref('/path/{uid}').onCreate((snap, context) => {
  const parentRef = snap.ref.parent; // The Database reference to the parent authorized with admin privileges
});
 

Вы все еще можете выполнить санкционированного пользователем изменения в базу данных в реальном времени с помощью администратора SDK:

 const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.impersonateMakeUpperCase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snap, context) => {
      const appOptions = JSON.parse(process.env.FIREBASE_CONFIG);
      appOptions.databaseAuthVariableOverride = context.auth;
      const app = admin.initializeApp(appOptions, 'app');
      const uppercase = snap.val().toUpperCase();
      const ref = snap.ref.parent.child('uppercase');

      const deleteApp = () => app.delete().catch(() => null);

      return app.database().ref(ref).set(uppercase).then(res => {
        // Deleting the app is necessary for preventing concurrency leaks
        return deleteApp().then(() => res);
      }).catch(err => {
        return deleteApp().then(() => Promise.reject(err));
      });
    });
 

Облако Firestore

Многое , как база данных в реальном времени изменения для версии 1.0, onWrite и onUpdate имеют параметр данных , который имеет before и after полей. События для onCreate и onDelete оба имеют параметр данных, представляющий собой облако Firestore DocumentSnapshot .

До (<= v0.9.1)

 exports.dbWrite = functions.firestore.document('/doc/path').onWrite((event) => {
  const beforeData = event.data.previous.data(); // data before the write
  const afterData = event.data.data(); // data after the write
});
 

Теперь (> = v1.0.0)

 exports.dbWrite = functions.firestore.document('/doc/path').onWrite((change, context) => {
  const beforeData = change.before.data(); // data before the write
  const afterData = change.after.data(); // data after the write
});
 

События для onCreate и onDelete оба имеют параметр данных , который является DocumentSnapshot .

До (<= v0.9.1)

 exports.dbDelete = functions.firestore.document('/doc/path').onDelete((event) => {
  const deletedData = event.data.previous.data(); // data that was deleted
});

 

Теперь (> = v1.0.0)

 exports.dbDelete = functions.firestore.document('/doc/path').onDelete((snap, context) => {
  const deletedData = snap.data(); // data that was deleted
});
 

Ломать Изменения в v2.0.0 для Firestore меток времени

По состоянию на v2.0.0 из Firebase SDK для облачных функций, значение временной метки в Firestore SNAPSHOT получило внутри функций являются Firestore Отметки объектов. Это относится и к snapshot.createTime , snapshot.updateTime , snapshot.readTime , и любые значения временной метки в snapshot.data()

Теперь (> = v2.0.0)

 exports.dbCreate = functions.firestore.document('/doc/path').onCreate((snap, context) => {
  //seconds of UTC time since Unix epoch
  console.log(snap.createTime.seconds);

  //fractions of a second at nanosecond resolution, 0 to 999,999,999
  console.log(snap.createTime.nanoseconds);
});
 

Аутентификация

В более ранних версиях event.data.metadata содержатся устаревшие поля createdAt и lastSignedInAt . Версия 1.0 удаляет эти поля полностью и заменяют их creationTime и lastSignInTime поле в userRecord.metadata параметре.

До (<= v0.9.1)

 // This code won't work with Cloud Functions SDK 1.0 and higher!
exports.authAction = functions.auth.user().onCreate((event) => {
  const userMetadata = event.data.metadata;

  const creationTime = userMetadata.createdAt; // 2016-12-15T19:37:37.059Z
  const lastSignInTime = userMetadata.lastSignedInAt; // 2018-01-03T16:23:12.051Z
}
 

Теперь (> = v1.0.0)

 exports.authAction = functions.auth.user().onCreate((userRecord, context) => {
  const creationTime = userRecord.metadata.creationTime; // 2016-12-15T19:37:37.059Z
  const lastSignInTime = userRecord.metadata.lastSignInTime; // 2018-01-03T16:23:12.051Z
}
 

Crashlytics

В V 1.0, обработчик событий , который срабатывает каждый раз , когда новая проблема возникает в onNew . Предыдущий обработчик имени onNewDetected был удален.

До (<= v0.9.1)

 exports.newIssue = functions.crashlytics.issue().onNewDetected((event) => {
  const issue = event.data;

  const issueId = issue.issueId;
  const issueTitle = issue.issueTitle;
  const appName = issue.appInfo.appName;
  const appId = issue.appInfo.appId;
  const appPlatform = issue.appInfo.appPlatform;
  const latestAppVersion = issue.appInfo.latestAppVersion;
  const createTime = issue.createTime;
}
 

Теперь (> = v1.0.0)

 exports.newIssue = functions.crashlytics.issue().onNew((issue, context) => {
  const issueId = issue.issueId;
  const issueTitle = issue.issueTitle;
  const appName = issue.appInfo.appName;
  const appId = issue.appInfo.appId;
  const appPlatform = issue.appInfo.appPlatform;
  const latestAppVersion = issue.appInfo.latestAppVersion;
  const createTime = issue.createTime;
}
 

Место хранения

onChange обработчик событий был удален. Вместо этого, v 1.0 поддерживает эти события:

  • onArchive только отсылается , когда ковш включен объект управления версиями . Это событие указывает на то, что живая версия объекта стала архивной версии, либо потому, что он был в архив или потому что она была перезаписана загрузки объекта одного и того же имени.
  • onDelete Отправляется , когда объект был удален навсегда. Это включает в себя объекты, которые перезаписаны или удалены как часть ведра конфигурации жизненного цикла . Для ведра с объектом управления onArchive storage.objects.delete версиями включено, не отправляется , когда объект находится в архиве (см onArchive ), даже если в архиве происходит через storage.objects.delete метод.
  • onFinalize Отправляется , когда новый объект (или новое поколение существующего объекта) успешно создан в ведре. Это включает в себя копирование или перезаписи существующего объекта. Неудачная загрузка не вызывает это событие.
  • onMetadataUpdate Sent , когда метаданные существующего изменения объекта.

До (<= v0.9.1)

 exports.processFile = functions.storage.object().onChange((event) => {
  const object = event.data;

  const filePath = object.name; // Path of the File
  const contentType = object.contentType; // Mime type of the file

  // Exit if this is a deletion event.
  if (object.resourceState === 'not_exists') {
    console.log('This file was deleted.');
    return null;
  }

  // Exit if file exists but is not new and is only being triggered
  // because of a metadata change.
  if (resourceState === 'exists' && metageneration > 1) {
    console.log('This is a metadata change event.');
    return null;
  }

  // ...
}
 

Теперь (> = v1.0.0)

 exports.processFile = functions.storage.object().onFinalize((object, context) => {
  const filePath = object.name; // Path of the File
  const contentType = object.contentType; // Mime type of the file

  // ...
}

exports.fileDeleted = functions.storage.object().onDelete((object, context) => {
  console.log('This file was deleted.');
}

exports.metadataUpdated = functions.storage.object().onMetadataUpdate((object, context) => {
  console.log('This is a metadata change event.');
}
 

Pub / Sub

Поскольку основной тип триггера изменился, вы должны переименовать и развернуть паб / подфункции. Никаких изменений в код функции не требуется.

Для того, чтобы обновить паб / подфункции:

  1. Переименовать функцию. Например, переименовать «myPubSubFunction» до «myNewPubSubFunction».
  2. Развертывание только эту функцию с помощью частичного развертывания:

    firebase deploy --only functions:myNewPubSubFunction

  3. После успешного развертывания «myNewPubSubFunction», удалите устаревшую функцию предварительного v.1.0.0 развернув все функции:

    firebase deploy --only functions

В течение короткого периода между этими командами развертывания, вы можете получить дубликаты триггеров. Чтобы справиться с этим делом , и для нормальной работы, убедитесь , что функции идемпотентной записи .

Чтобы узнать больше, смотрите ссылку API .

Изменения в эмуляции функций

  • firebase serve в настоящее время обслуживает обе функции HTTP и хостинг по умолчанию.
  • firebase experimental:functions:shell , которая эмулирует все функции, была переименована в firebase functions:shell .

Синтаксис для изменения функции оболочки

Синтаксис для вызова функции через функцию оболочки был обновлен с учетом синтаксиса firebase-функций v1.0.0 +.

 // Inside functions shell

// To emulate database writes done by an administrative user:
myDbFunction(‘data’)

// To emulate database writes done by an authenticated user:
myDbFunction(‘data’, { auth: { uid: ‘abc’ }})

// To emulate database writes done by an unauthenticated user:
myDbFunction(‘data’, { authMode: ‘UNAUTHENTICATED’)