Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

راه‌اندازی پایگاه داده بیدرنگ

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

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

  1. منتظر تغییرات در یک مسیر خاص پایگاه داده بیدرنگ است.
  2. هنگامی که یک رویداد رخ می دهد و وظایف خود را انجام می دهد، راه اندازی می شود.
  3. یک شی داده را دریافت می کند که حاوی یک عکس فوری از داده های ذخیره شده در آن مسیر است.

می توانید یک تابع را در پاسخ به نوشتن، ایجاد، به روز رسانی یا حذف گره های پایگاه داده در پایگاه داده بیدرنگ Firebase فعال کنید.

یک تابع را در تغییرات پایگاه داده بیدرنگ Firebase فعال کنید

از بسته فرعی firebase-functions/v2/database برای ایجاد تابعی استفاده کنید که رویدادهای پایگاه داده بیدرنگ Firebase را مدیریت می کند. برای کنترل زمان راه‌اندازی تابع، یکی از کنترل‌کننده‌های رویداد را مشخص کنید و مسیر پایگاه داده بیدرنگ را که در آن به رویدادها گوش می‌دهد، مشخص کنید.

تنظیم مکان عملکرد

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

مدیریت رویدادهای پایگاه داده بیدرنگ

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

این کنترل کننده ها برای پاسخگویی به رویدادهای پایگاه داده بیدرنگ در دسترس هستند:

  • onValueWritten() فقط زمانی فعال می شود که داده ها در پایگاه داده بلادرنگ نوشته شوند.
  • onValueCreated() فقط زمانی فعال می شود که داده در پایگاه داده بیدرنگ ایجاد شود.
  • onValueUpdated() فقط زمانی فعال می شود که داده ها در پایگاه داده بیدرنگ به روز شوند.
  • onValueDeleted() فقط زمانی فعال می شود که داده ها در پایگاه داده بیدرنگ حذف شوند.

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

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

به عنوان مثال، استفاده از onValueWritten() برای تصویر:

# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
const onwrittenfunctiondefault = onValueWritten("/user/{uid}", (event) => {
  // …
});

# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid}",
    instance: "my-app-db-2"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid=*@gmail.com}",
    instance: "my-app-db-*"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

این پارامترها تابع شما را هدایت می‌کنند تا نوشته‌ها را در یک مسیر مشخص در نمونه پایگاه داده Realtime مدیریت کند.

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

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

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

وحشی و گرفتن

می‌توانید از {key} ، {key=*} ، {key=prefix*} ، {key=*suffix} برای عکس‌برداری استفاده کنید. * , prefix* , *suffix برای عجایب تک بخش. توجه: ** نشان دهنده عجایب چند بخش است که RTDB از آن پشتیبانی نمی کند. به درک الگوهای مسیر مراجعه کنید.

عجایب مسیر. شما می توانید یک جزء مسیر را به عنوان یک علامت عام مشخص کنید:

  • با استفاده از ستاره، * . به عنوان مثال، foo/* با هر فرزند یک سطح از سلسله مراتب گره زیر foo/ مطابقت دارد.
  • با استفاده از یک بخش حاوی ستاره، * . برای مثال، foo/app*-us هر بخش فرزند زیر foo/ را با پیشوند app و پسوند -us .

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

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

مسیر "/foo/*" را دو بار مطابقت می دهد: یک بار با "hello": "world" و بار دیگر با "firebase": "functions" .

گرفتن مسیر می‌توانید تطبیق‌های مسیر را در متغیرهای نام‌گذاری شده برای استفاده در کد تابع خود ثبت کنید (به عنوان مثال /user/{uid} ، /user/{uid=*-us} ).

مقادیر متغیرهای capture در شیء database.DatabaseEvent.params تابع شما موجود است.

عجایب نمونه. شما همچنین می توانید یک جزء نمونه را با استفاده از wildcarding مشخص کنید. یک علامت عام نمونه می تواند دارای پیشوند، پسوند یا هر دو باشد (مثلاً my-app-*-prod ).

علامت عام و مرجع ضبط

با Cloud Functions v2 و Realtime Database، می توان از یک الگو در هنگام تعیین ref و instance کرد. هر رابط ماشه ای گزینه های زیر را برای تعیین محدوده یک تابع خواهد داشت:

مشخص کردن ref مشخص کردن instance رفتار - اخلاق
تک ( /foo/bar ) مشخص نیست Scopes handler برای همه نمونه ها در ناحیه تابع.
تک ( /foo/bar ) تک ( 'my-new-db' ) Scopes handler به یک نمونه خاص در ناحیه تابع.
تک ( /foo/bar ) الگو ( 'inst-prefix*' ) کنترل‌کننده دامنه برای همه نمونه‌هایی که با الگوی ناحیه تابع مطابقت دارند.
الگو ( /foo/{bar} ) مشخص نیست Scopes handler برای همه نمونه ها در ناحیه تابع.
الگو ( /foo/{bar} ) تک ( 'my-new-db' ) Scopes handler به یک نمونه خاص در ناحیه تابع.
الگو ( /foo/{bar} ) الگو ( 'inst-prefix*' ) کنترل‌کننده دامنه برای همه نمونه‌هایی که با الگوی ناحیه تابع مطابقت دارند.

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

هنگام مدیریت یک رویداد پایگاه داده بیدرنگ، شی داده ای که برگردانده می شود یک DataSnapshot است.

برای رویدادهای onValueWritten یا onValueUpdated ، اولین پارامتر یک شی Change است که شامل دو عکس فوری است که وضعیت داده قبل و بعد از رویداد راه‌اندازی را نشان می‌دهد.

برای رویدادهای onValueCreated و onValueDeleted ، شی داده‌ای که برگردانده می‌شود یک عکس فوری از داده‌های ایجاد شده یا حذف شده است.

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

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.log('Uppercasing', event.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 event.data.ref.parent.child('uppercase').set(uppercase);
    });

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

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

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

    exports makeuppercase = onValueWritten("/messages/{pushId}/original", (event) => {
          // Only edit data when it is first created.
          if (event.data.before.exists()) {
            return null;
          }
          // Exit when the data is deleted.
          if (!event.data.after.exists()) {
            return null;
          }
          // Grab the current value of what was written to the Realtime Database.
          const original = event.data.after.val();
          console.log('Uppercasing', event.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 event.data.after.ref.parent.child('uppercase').set(uppercase);
        });