Catch up on everthing we announced at this year's Firebase Summit. Learn more

محرک های پایگاه داده

با استفاده از عملکردهای ابری ، می توانید بدون نیاز به به روزرسانی کد مشتری ، رویدادها را در پایگاه داده Realtime Firebase مدیریت کنید. عملکردهای ابری به شما امکان می دهد عملیات پایگاه داده Realtime را با امتیازات کامل اداری اجرا کنید و اطمینان حاصل می کند که هر تغییر در پایگاه داده Realtime به صورت جداگانه پردازش می شود. شما می توانید فایربیس بیدرنگ تغییرات پایگاه داده از طریق را DataSnapshot و یا از طریق SDK محیط مدیریت .

در یک چرخه زندگی معمولی ، عملکرد پایگاه داده Realtime Firebase موارد زیر را انجام می دهد:

  1. منتظر تغییرات در یک پایگاه داده Realtime خاص است.
  2. فیلیپ فلاپ ها زمانی که یک رویداد رخ می دهد و در انجام وظایف خود (نگاه کنید به چه می توانم با توابع ابر انجام دهد؟ برای نمونه هایی از موارد استفاده).
  3. یک شیء داده را دریافت می کند که حاوی یک تصویر فوری از داده های ذخیره شده در سند مشخص شده است.

فعال کردن یک تابع پایگاه داده در زمان واقعی

ایجاد توابع جدید برای رویدادهای پایگاه بیدرنگ با functions.database . برای کنترل زمان فعال شدن تابع ، یکی از کنترل کننده های رویداد را مشخص کنید و مسیر Realtime Database را مشخص کنید که در آن به رویدادها گوش می دهد.

تنظیم کننده رویداد را تنظیم کنید

توابع به شما امکان می دهد رویدادهای پایگاه داده را در دو سطح خاص مدیریت کنید. شما می توانید به طور خاص فقط برای ایجاد ، به روزرسانی یا حذف رویدادها گوش دهید ، یا می توانید به هر نوع تغییر در مسیر گوش دهید. عملکردهای ابری از این کنترل کننده های رویداد برای پایگاه داده Realtime پشتیبانی می کند:

  • onWrite() ، که باعث هنگامی که اطلاعات ایجاد شده، به روز رسانی، و یا حذف در پایگاه داده بیدرنگ.
  • onCreate() ، که باعث هنگامی که داده های جدید در پایگاه بیدرنگ ایجاد شده است.
  • onUpdate() ، که باعث هنگامی که داده ها در پایگاه داده های زمان واقعی به روز.
  • onDelete() ، که باعث هنگامی که داده ها از پایگاه داده بیدرنگ حذف شده است.

نمونه و مسیر را مشخص کنید

برای کنترل زمان و جایی که تابع شما باید آغاز کند، پاسخ ref(path) برای مشخص کردن یک مسیر، و اختیاری یک مثال پایگاه داده بیدرنگ با instance('INSTANCE_NAME') . اگر نمونه ای را مشخص نکنید ، تابع روی نمونه پیش فرض پایگاه داده Realtime برای پروژه Firebase اجرا می شود. به عنوان مثال:

  • نمونه پیش فرض پایگاه بیدرنگ: functions.database.ref('/foo/bar')
  • به عنوان مثال به نام "من برنامه-DB-2": functions.database.instance('my-app-db-2').ref('/foo/bar')

این روشها عملکرد شما را برای رسیدگی به نوشتارها در یک مسیر خاص در نمونه پایگاه داده Realtime هدایت می کند. مشخصات مسیر مطابقت با تمام می نویسد که یک مسیر، از جمله می نویسد که در هر نقطه در زیر آن اتفاق می افتد را لمس کند. اگر شما از مسیر برای عملکرد خود را به عنوان /foo/bar ، آن را منطبق حوادث در هر دو از این مکان:

 /foo/bar
 /foo/bar/baz/really/deep/path

در هر صورت، تفسیر فایربیس که این رویداد در رخ می دهد /foo/bar ، و داده های رویداد شامل داده های قدیمی و جدید در /foo/bar . اگر ممکن است داده های رویداد بزرگ باشند ، از چندین توابع در مسیرهای عمیق تر به جای یک تابع در نزدیکی ریشه پایگاه داده خود استفاده کنید. برای بهترین عملکرد ، فقط داده ها را در عمیق ترین سطح ممکن درخواست کنید.

می توانید با احاطه کردن براکت های پیچ دار ، یک جزء مسیر را به عنوان یک علامت wild مشخص کنید. ref('foo/{bar}') با هر فرزند /foo . مقادیر این اجزا مسیر از کلمات در دسترس هستند EventContext.params هدف از عملکرد خود را. در این مثال، ارزش های موجود به عنوان context.params.bar .

مسیرهای دارای حروف بزرگ می توانند با چندین رویداد از یک نوشته واحد مطابقت داشته باشند. درج از

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

منطبق بر مسیر "/foo/{bar}" دو بار: یک بار با "hello": "world" و دوباره با "firebase": "functions" .

مدیریت داده های رویداد

هنگامی که دست زدن به یک رویداد پایگاه بیدرنگ، داده های شی بازگشت است DataSnapshot . برای onWrite یا onUpdate حوادث، اولین پارامتر است Change شی که شامل دو عکس های فوری که نشان دهنده وضعیت داده ها قبل و بعد از این رویداد رها سازی. برای onCreate و onDelete حوادث، داده های شی بازگشت یک عکس فوری از داده های ایجاد شده و یا حذف شده است.

در این مثال، تابع، عکس فوری برای مسیر مشخص شده به عنوان snap ، تبدیل رشته در آن محل به حروف بزرگ، و می نویسد: آن رشته را به پایگاه داده اصلاح شده:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      functions.logger.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    });

دسترسی به اطلاعات احراز هویت کاربر

از EventContext.auth و EventContext.authType ، شما می توانید اطلاعات کاربران، از جمله صدور مجوز برای کاربر که باعث یک تابع دسترسی داشته باشید. این می تواند برای اجرای قوانین امنیتی مفید باشد و به عملکرد شما اجازه می دهد عملیات مختلف را بر اساس سطح مجوزهای کاربر تکمیل کند:

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

exports.simpleDbFunction = functions.database.ref('/path')
    .onCreate((snap, context) => {
      if (context.authType === 'ADMIN') {
        // do something
      } else if (context.authType === 'USER') {
        console.log(snap.val(), 'written by', context.auth.uid);
      }
    });

همچنین ، می توانید از اطلاعات احراز هویت کاربر برای "جعل هویت" کاربر و انجام عملیات نوشتن از طرف کاربر استفاده کنید. برای جلوگیری از مشکلات همزمانی ، حتماً برنامه را مطابق شکل زیر حذف کنید:

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));
      });
    });

خواندن مقدار قبلی

Change شی دارای یک before اموال که به شما امکان بازرسی چه قبل از این رویداد به پایگاه بیدرنگ ذخیره شده است. before بازده اموال DataSnapshot که در آن تمام روش (به عنوان مثال، val() و exists() ) به مقدار قبلی مراجعه کنید. شما می توانید مقدار جدید دوباره یا با استفاده از اصلی به عنوان خوانده DataSnapshot یا خواندن after اموال. این ویژگی در هر Change دیگری است DataSnapshot نمایندگی از دولت از داده ها پس از اتفاق افتاده بود.

به عنوان مثال، before اموال را می توان مورد استفاده قرار گیرد تا مطمئن شوید که تابع فقط uppercases متن زمانی که آن را برای اولین بار ایجاد:

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return change.after.ref.parent.child('uppercase').set(uppercase);
    });