Рубрики
Без рубрики

Учебник Node.js и Cloud Firestore – Как построить систему инвентаризации дома

В этой статье вы будете практиковать свои навыки JavaScript во время оптимизации домашних хозяйств, создавая свою собственную систему инвентаризации для дома. In this article, you’ll practice your JavaScript skills while streamlining your household chores by creating your very own home inventory system. I’ve often found that it’s hard to keep track common household items that I buy frequently such as food, spices, medicine, and the like. It’s annoying at best and Я часто обнаружил, что трудно отслеживать общие предметы домашних хозяйств, которые я часто покупаю, таких как еда, специи, лекарства и тому подобное. Это раздражает в лучшем случае и

Автор оригинала: Suchandra Datta.

В этой статье вы будете практиковать свои навыки JavaScript во время оптимизации домашних хозяйств, создавая свою собственную систему инвентаризации для дома.

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

Устали от следа вручную, я решил сделать мою собственную систему инвентаризации. Эта система позволит мне:

  • Создание записей для каждого элемента, а также полезная информация, такая как цена и количество
  • Фильтрующие элементы на основе различных критериев, таких как цена, количество и срок годности
  • сортировка предметов на основе заданных критериев
  • Удалить предметы, которые больше не используются
  • редактировать существующие записи

В этом руководстве я прогуляю вас через процесс того, как я построил эту систему. Давайте начнем.

Как определить схему базы данных

Облако Firestore Облачная, масштабируемая, гибкая база данных NoSQL, предлагаемая Firebase. Данные хранятся в документах, а документы объединяются вместе в коллекции, аналогичные хранению страниц информации в файле и хранения нескольких файлов вместе в ящике.

Firestore предлагает мощные варианты запроса, начиная от простого сортировки до добавления пределов для результатов запроса.

Для наших целей мы определим коллекцию для определенной категории. Каждый документ будет соответствовать продукту в рамках этой категории, и содержимое документа будет каждое поле информации вместе с его значением данных. Например:

"Snacks" : {
	"Food_Item_1" : { "Price":P1, "Quantity":Q1, "ExpiryDate":D1},
	"Food_Item_2" : { "Price":P2, "Quantity":Q2, "ExpiryDate":D2},	
    .
    .
	"Food_Item_N" : { "Price":PN, "Quantity":QN, "ExpiryDate":DN}
}

Наше имя коллекции будет закусками, наши имена документов будут Food_item_1, food_item_2 и так далее, и содержание каждого документа будет цена, количество и срок годности.

Как получить вход от пользователя

Сначала создадим несколько маршрутов и представлений и импортируйте необходимые узловые модули.

const express = require("express")
const app = express()
//Middleware to parse data in body portion of incoming request, like POST //request
const body_parser = require("body-parser")

objForUrlencoded = body_parser.urlencoded({extended:false})

app.set("view engine", "ejs")
app.use("/assets", express.static("assets"))
app.use(objForUrlencoded)

app.get("/", (req,res,next)=>{//Show the homepage
	res.render("homepage")
})
app.get("/save_data.ejs", (req,res,next)=>{//Show the form for saving data
	res.render("save_data")
})
app.get("/search_data.ejs", (req,res,next)=>{//Show the form for searching data
	res.render("search_data")
})

app.listen(1337, ()=>{ console.log("Listening on port 1337")})

Здесь мы определяем простое приложение Express, которое слушает на порту 1337 и оказывает страницы, как указано в HTTP-метода (Get, Post) и URL. Мы создаем простую форму для ввода пользователя.

Имейте в виду, что каждое поле ввода HTML должно иметь атрибут имени, который позже будет служить ключом для доступа к соответствующим значениям входного поля. Например:








Позже мы можем получить доступ к названию продукта в качестве значения ключа «Productname», категории продукта в качестве значения ключа «ProductCategory» и так далее.

Как сохранить данные в базу данных

Тогда, теперь, когда у нас есть некоторые данные, давайте сохраним его на FireStore! Это включает в себя настройку учетной записи службы, получая секретный ключ, и использование того, что для инициализации объекта учетных данных для подключения базы данных в нашем приложении с использованием API Admin FireBase APID.

Для более глубокого объяснения процесса вы можете проверить их документы For a more in-depth explanation of the process, you can check out their docs

/*Set up Admin API for Firebase*/
const admin = require('firebase-admin');
//Define path to secret key generated for service account
const serviceAccount = require(PATH TO KEY);
//Initialize the app
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

Здесь мы использовали путь к секретному ключу, который является файлом JSON. Вы можете сделать то же самое, определяя переменные среды, как описано здесь Отказ

Далее мы сохраняем наши данные на FireStore, используя метод SET следующим образом:

let db = admin.firestore()

//Depending on your schema, save data by specifying the collection name, //document name and data contents as follows
await db.collection(key).doc(prod).set(save_to_database[key][prod])

Вот несколько терминов, с которыми вы должны быть знакомы, когда навигация о FireStore Docs, особенно Ссылка API :

  • Коллекция – Этот объект используется для добавления документов, получение документов DocumentReferences и запросов документов.
  • Документальный орган – Это относится к расположению документа в базе данных, используемой для чтения/записи/прослушивания этого местоположения.
  • Querysnapshot – объект, который содержит результаты запроса
  • Documentnapshot – Содержит данные, прочитанные из документа. Вы можете извлечь данные, используя метод .data ().

Как запросить данные

После того, как FireStore упакован с данными, мы можем выполнять всевозможные сложные запросы на нем.

Допустим, мы хотим знать, сколько предметов у нас с категорией «закуски». Всякий раз, когда мы выполняем запрос, мы получаем Querysnapshot, который представляет собой список документовNAPSHOTS.

//Get all docs under the given category
helper_func_get_data = async (category, db) => {
	const data = await db.collection(category).get()
	if(data.empty)
		{
			return -1
		}
	else return data

}

Мы можем проверить, что запрос вернул любые данные вообще используя свойство. Пупы и итерации по всем полученным документам, используя функцию foreach, как это:

data.forEach((doc) => { Product_Info[doc.id] = doc.data()})

//Here data is a QuerySnapshot and Product_Info is a JavaScript object 
//with document names as keys and their corresponding values. We can pass this 
//object as an argument in render() method to display the received contents

Вот как выяснить общую цену всех закусок:

total_agg = 0
data.forEach((doc) => { total_agg+=doc.data()[aggregate_over]

//aggregate_over is a variable which defines criteria to sum over like price //or quantity

Сортировать все закуски на основе их цены, сделайте это:

const data = await db.collection(category).orderBy(filter_criteria).get() 

куда.

Как удалить элементы из базы данных

Со временем наши домашние предметы, которые мы потребляем ежедневно, истощаются, и нам нужно будет удалить их из базы данных для поддержания согласованности.

До тех пор, пока нет возможности подключения холодильника к облачному огненному огнему, нам придется вручную удалить наши записи для закусок, как только мы их съели.

firebase_delete_data = async (category, response, product_name) => {
	try
	{ 
	  let db = admin.firestore()
	  await db.collection(category).doc(product_name).delete()
	  response.render("search_data")
	   }
	catch(err)
	{console.log(err)}
}

Как обновлять элементы в базе данных

firebase_update_data = async (category, response, reqbody) => {
	try
	{
		let db = admin.firestore()
		await db.collection(category).doc(reqbody["productName"]).update({"Price": parseFloat(reqbody["price"]), "Quantity": parseFloat(reqbody["quantity"]), "ExpiryDate": reqbody["expiryDate"]})
		response.render("successpage")
	}
	catch(err)
	{
		console.log(err)
		response.render("failurepage")
	}
}

Другая общая функциональность, которую мы захотим, – это обновить существующие записи в базе данных.

Как только наши функциональные возможности будут реализованы, мы экспортируем функции для использования из нашего Express App, как это:

module.exports = {
	"firebase_save_data" : firebase_save_data,
	"firebase_retrieve_data": firebase_retrieve_data,
	"firebase_delete_data": firebase_delete_data,
	"firebase_update_data": firebase_update_data
	}

и импортировать необходимый модуль следующим образом:

const firebase_functions = require("./firebase_CRUD_custom_code/firebase_functions.js")

Тогда мы можем использовать наши функции по мере необходимости. Например, если мы хотим обновить любые элементы, мы можем сделать следующее:

app.post("/update", objForUrlencoded, (req,res) => {
	
	firebase_functions.firebase_update_data(req.body["category"], res, req.body)
})

Удаление!

Чтобы завернуть, в этой статье мы узнали о модели данных Cloud FireStore, как сохранить данные, механизм для получения данных, как работать с помощью Querysnapshots, сортировка данных на разных фильтрах, удаление элементов и обновления элементов через наше приложение Express Отказ

Таким образом, мы можем автоматизировать задачу отслеживания часто используемых продуктов в наших домохозяйствах. Мы также можем проверить, какие продукты отсутствуют на складе, и намного больше, чтобы наша занятая жизнь проще.

Я надеюсь, что вам понравилось читать эту статью так же сильно, как мне нравилось писать. Спасибо за ваше время, хорошего дня и счастливого кодирования!