خواندن و نوشتن داده ها در وب

(اختیاری) نمونه اولیه و آزمایش با Firebase Local Emulator Suite

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

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

استفاده از شبیه ساز Realtime Database فقط شامل چند مرحله است:

  1. افزودن یک خط کد به پیکربندی آزمایشی برنامه برای اتصال به شبیه ساز.
  2. از ریشه دایرکتوری پروژه های محلی خود را، در حال اجرا firebase emulators:start .
  3. برقراری تماس از کد نمونه اولیه برنامه خود با استفاده از یک SDK پلت فرم پایگاه داده بیدرنگ، طبق معمول، یا با استفاده از Realtime Database REST API.

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

یک مرجع پایگاه داده دریافت کنید

به خواندن و یا نوشتن اطلاعات از پایگاه داده، شما نیاز به یک نمونه از firebase.database.Reference :

نسخه وب 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

نسخه وب 8

var database = firebase.database();

داده ها را بنویسید

این سند اصول بازیابی داده ها و نحوه سفارش و فیلتر کردن داده های Firebase را پوشش می دهد.

داده Firebase به با اتصال شنونده ناهمزمان به بازیابی firebase.database.Reference . شنونده یک بار برای وضعیت اولیه داده ها و بار دیگر هر زمان که داده ها تغییر کند فعال می شود.

عملیات نوشتن اولیه

برای عملیات نوشتن اولیه، شما می توانید استفاده کنید set() ذخیره اطلاعات را به یک مرجع مشخص، جایگزین هر گونه اطلاعات موجود در این مسیر است. به عنوان مثال یک نرم افزار وبلاگ نویسی اجتماعی ممکن است یک کاربر با اضافه set() شرح زیر است:

نسخه وب 9

import { getDatabase, ref, set } from "firebase/database";

function writeUserData(userId, name, email, imageUrl) {
  const db = getDatabase();
  set(ref(db, 'users/' + userId), {
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

نسخه وب 8

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

با استفاده از set() رونویسی داده در محل مشخص شده، از جمله هر گره فرزند.

داده ها را بخوانید

به رویدادهای ارزشی گوش دهید

برای خواندن داده ها در یک مسیر و گوش دادن به تغییرات، استفاده از onValue() برای مشاهده رویداد. می‌توانید از این رویداد برای خواندن عکس‌های فوری استاتیک از مطالب در یک مسیر مشخص استفاده کنید، همانطور که در زمان رویداد وجود داشتند. این روش یک بار در زمانی که شنونده متصل می شود و دوباره هر بار که داده ها، از جمله کودکان، تغییر می کنند، فعال می شود. پاسخ تماس رویداد یک عکس فوری حاوی تمام داده‌ها در آن مکان، از جمله داده‌های فرزند ارسال می‌شود. اگر هیچ داده ها وجود دارد، عکس فوری خواهد گشت false که با شما تماس exists() و null که با شما تماس val() بر روی آن.

مثال زیر یک برنامه وبلاگ نویسی اجتماعی را نشان می دهد که تعداد ستاره یک پست را از پایگاه داده بازیابی می کند:

نسخه وب 9

import { getDatabase, ref, onValue} from "firebase/database";

const db = getDatabase();
const starCountRef = ref(db, 'posts/' + postId + '/starCount');
onValue(starCountRef, (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

نسخه وب 8

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

شنونده دریافت snapshot که شامل داده در محل مشخص شده در پایگاه داده در زمان این رویداد است. شما می توانید داده ها در بازیابی snapshot با val() روش.

یک بار داده ها را بخوانید

یکبار داده ها را با get() بخوانید

SDK برای مدیریت تعاملات با سرورهای پایگاه داده طراحی شده است، چه برنامه شما آنلاین یا آفلاین باشد.

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

اگر شما نیاز به اطلاعات تنها یک بار، شما می توانید استفاده get() برای به دست آوردن یک تصویر لحظهای از داده ها از پایگاه داده است. اگر به هر دلیلی get() قادر به بازگشت به ارزش سرور، مشتری از cache ذخیره سازی محلی بررسی و بازگشت خطا اگر مقدار هنوز یافت نشد.

استفاده غیر ضروری از get() می توانید با استفاده از پهنای باند و به از دست دادن عملکرد، که می تواند با استفاده از یک شنونده زمان واقعی به عنوان بالا نشان داده شده مانع افزایش می دهد.

نسخه وب 9

import { getDatabase, ref, child, get } from "firebase/database";

const dbRef = ref(getDatabase());
get(child(dbRef, `users/${userId}`)).then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

نسخه وب 8

const dbRef = firebase.database().ref();
dbRef.child("users").child(userId).get().then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

داده ها را یک بار با ناظر بخوانید

در برخی موارد ممکن است بخواهید به جای بررسی مقدار به روز شده در سرور، مقدار از حافظه نهان محلی بلافاصله برگردانده شود. در آن موارد شما می توانید استفاده کنید once() برای دریافت داده ها از حافظه پنهان دیسک محلی بلافاصله.

این برای داده‌هایی مفید است که فقط یک بار باید بارگیری شوند و انتظار نمی‌رود مرتباً تغییر کنند یا نیاز به گوش دادن فعال داشته باشند. به عنوان مثال، برنامه وبلاگ نویسی در مثال های قبلی از این روش برای بارگیری نمایه کاربر هنگام شروع نوشتن یک پست جدید استفاده می کند:

نسخه وب 9

import { getDatabase, ref, onValue } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const userId = auth.currentUser.uid;
return onValue(ref(db, '/users/' + userId), (snapshot) => {
  const username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
}, {
  onlyOnce: true
});

نسخه وب 8

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then((snapshot) => {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

به روز رسانی یا حذف داده ها

فیلدهای خاص را به روز کنید

به طور همزمان به کودکان خاص از یک گره ارسال بدون جای نوشتن دیگر گره فرزند، با استفاده از update() روش.

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

به عنوان مثال، یک برنامه وبلاگ نویسی اجتماعی ممکن است یک پست ایجاد کند و به طور همزمان آن را به فید فعالیت اخیر و فید فعالیت کاربر پست کننده با استفاده از کدی مانند زیر به روز کند:

نسخه وب 9

function writeNewPost(uid, username, picture, title, body) {
  const db = getDatabase();

  // A post entry.
  const postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  const newPostKey = push(child(ref(db), 'posts')).key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  const updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return update(ref(db), updates);
}

نسخه وب 8

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

این مثال با استفاده push() برای ایجاد یک پست در گره حاوی پست برای همه کاربران در /posts/$postid و به طور همزمان بازیابی کلید. سپس کلید می توان برای ایجاد یک ورودی دوم در پست کاربر در /user-posts/$userid/$postid .

با استفاده از این مسیرها، شما می توانید به روز رسانی به طور همزمان به مکان های مختلف در درخت JSON با یک تماس واحد به انجام update() مانند این که چگونه این مثال پست جدید در هر دو منطقه ایجاد،. به‌روزرسانی‌های همزمان ساخته شده به این روش اتمی هستند: یا همه به‌روزرسانی‌ها موفق می‌شوند یا همه به‌روزرسانی‌ها با شکست مواجه می‌شوند.

یک پاسخ تماس تکمیلی اضافه کنید

اگر می‌خواهید بدانید چه زمانی داده‌های شما متعهد شده‌اند، می‌توانید یک تماس تکمیلی اضافه کنید. هر دو set() و update() یک پاسخ به تماس اتمام اختیاری است که به نام وقتی که نوشتن به پایگاه داده متعهد شده است. اگر تماس ناموفق بود، به تماس با یک شی خطا ارسال می شود که نشان می دهد چرا شکست رخ داده است.

نسخه وب 9

import { getDatabase, ref, set } from "firebase/database";

const db = getDatabase();
set(ref(db, 'users/' + userId), {
  username: name,
  email: email,
  profile_picture : imageUrl
})
.then(() => {
  // Data saved successfully!
})
.catch((error) => {
  // The write failed...
});

نسخه وب 8

firebase.database().ref('users/' + userId).set({
  username: name,
  email: email,
  profile_picture : imageUrl
}, (error) => {
  if (error) {
    // The write failed...
  } else {
    // Data saved successfully!
  }
});

داده ها را حذف کنید

ساده ترین راه برای داده حذف است به تماس remove() در اشاره به محل آن داده است.

شما همچنین می توانید با مشخص حذف null به عنوان ارزش برای عمل نوشتن دیگری مانند set() و یا update() . شما می توانید این تکنیک را با استفاده از update() کودکان چند جهت حذف در یک تماس API.

دریافت یک Promise

به زمانی که اطلاعات خود را به پایگاه فایربیس بیدرنگ سرور متعهد، شما می توانید یک استفاده Promise . هر دو set() و update() می تواند یک بازگشت Promise شما می توانید استفاده به زمانی که نوشتن را به پایگاه داده، متعهد است.

شنوندگان را جدا کنید

تماس مجدد هستند با تماس با حذف off() روش در مرجع پایگاه داده فایربیس خود را.

شما می توانید یک شنونده تنها با انتقال آن به عنوان پارامتر به حذف off() . تماس off() در محل بدون آرگومان حذف تمام شنوندگان در آن محل.

تماس off() در شنونده پدر یا مادر به طور خودکار حذف شنوندگان ثبت شده در گره فرزند خود را نه؛ off() نیز باید در هر شنوندگان کودک نامیده می شود برای حذف پاسخ به تماس.

ذخیره داده ها به عنوان تراکنش

در هنگام کار با داده هایی را که می توان با تغییرات همزمان، مثل شمارنده افزایشی خراب شده، شما می توانید یک استفاده عملیات معامله . می توانید به این عملیات یک عملکرد به روز رسانی و یک پاسخ تماس تکمیل اختیاری بدهید. تابع به روز رسانی وضعیت فعلی داده ها را به عنوان آرگومان می گیرد و حالت دلخواه جدیدی را که می خواهید بنویسید برمی گرداند. اگر مشتری دیگری قبل از اینکه مقدار جدید شما با موفقیت نوشته شود، در مکان بنویسد، تابع به روز رسانی شما دوباره با مقدار فعلی جدید فراخوانی می شود و نوشتن دوباره امتحان می شود.

به عنوان مثال، در مثال برنامه وبلاگ نویسی اجتماعی، می‌توانید به کاربران اجازه دهید پست‌ها را ستاره‌دار و حذف کنند و تعداد ستاره‌های دریافتی یک پست را به شرح زیر پیگیری کنند:

نسخه وب 9

import { getDatabase, ref, runTransaction } from "firebase/database";

function toggleStar(uid) {
  const db = getDatabase();
  const postRef = ref(db, '/posts/foo-bar-123');

  runTransaction(postRef, (post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

نسخه وب 8

function toggleStar(postRef, uid) {
  postRef.transaction((post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

استفاده از تراکنش از نادرست بودن تعداد ستاره ها جلوگیری می کند اگر چندین کاربر همزمان یک پست را ستاره دار کنند یا مشتری داده های قدیمی داشته باشد. اگر تراکنش رد شود، سرور مقدار فعلی را به کلاینت برمی گرداند، که تراکنش را دوباره با مقدار به روز شده اجرا می کند. این کار تا زمانی که تراکنش پذیرفته شود یا معامله را لغو کنید تکرار می شود.

افزایش سمت سرور اتمی

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

function addStar(uid, key) {
  const updates = {};
  updates[`posts/${key}/stars/${uid}`] = true;
  updates[`posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  updates[`user-posts/${key}/stars/${uid}`] = true;
  updates[`user-posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  firebase.database().ref().update(updates);
}

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

اگر می‌خواهید تداخل‌های خاص برنامه را شناسایی و رد کنید، مانند ستاره‌دار شدن پستی توسط کاربر که قبلاً آن را ستاره‌دار کرده است، باید قوانین امنیتی سفارشی را برای آن مورد استفاده بنویسید.

با داده ها به صورت آفلاین کار کنید

اگر یک سرویس گیرنده اتصال شبکه خود را از دست بدهد، برنامه شما به درستی به کار خود ادامه می دهد.

هر کلاینت متصل به پایگاه داده Firebase، نسخه داخلی خود از هر داده فعال را حفظ می کند. وقتی داده نوشته می شود، ابتدا در این نسخه محلی نوشته می شود. سپس مشتری Firebase آن داده ها را با سرورهای پایگاه داده راه دور و با سایر مشتریان بر اساس "بهترین تلاش" همگام سازی می کند.

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

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

ما بیشتر در مورد رفتار آفلاین در صحبت بیشتر بدانید در مورد آنلاین و قابلیت های آنلاین ..

مراحل بعدی