Как увеличивать числа Независимо, в системе заказов.
Фреймворки: Next.js, MongoDB, Mongoose.
Инструменты: VS Code, MongoDB Compass, Postman.
Недавно я участвовал в проекте, в котором мы создавали сайт заказа для местного ресторана. Как и во всех сайтах заказов, нам нужно было найти способ дать уникальный номер заказа каждому заказу, сделанному с помощью нашего сайта. Номер, который можно показать нашему клиенту. В основном для поддержки клиентов, на случай, если они захотят изменить или отменить заказ.
Вы можете спросить: «А почему бы просто не использовать уникальный идентификатор, генерируемый MongoDB?».
Ответом на этот вопрос является пользовательский интерфейс. Мы хотим представить нашему клиенту простой номер, чистый номер. Такое, которое относительно легко запомнить.
Есть еще одно преимущество в контроле вида чисел, о котором я расскажу позже.
Конечно, мы хотели избежать ситуации, когда два заказа имеют одинаковый номер заказа, поэтому мы должны основывать наш счетчик на базе данных, иначе при каждом рендере сайта номер заказа всегда будет возвращаться к первоначальному номеру, который был определен.
Сначала мы использовали countDocuments() из mongoose, чтобы подсчитать количество существующих заказов в нашей коллекции «orders», увеличить его на 1 и присвоить это новое число новому заказу. Это решение было хорошим, но оно ограничивало нас, потому что если нам нужно было удалить какой-либо заказ из нашей коллекции, мы могли оказаться с двумя или более заказами с одинаковым номером заказа.
В итоге мы создали коллекцию с одним документом, в котором хранится номер. Номер в коллекции обновляется каждый раз, когда размещается заказ, и новый номер присваивается заказу.
Мы можем разделить этот процесс на четыре этапа:
- 1. Определение схем.
- 2. Построение и определение соответствующих маршрутов API. (Post counter, Post Order).
- 3. Установка начального значения в числовой схеме. (с помощью ‘Post Counter’).
- 4. Написание двух зависимых функций: Одна функция для номера, а другая для размещения Нового заказа с новым номером.
- 1. Определение схем.
- 2. Построение и определение соответствующих маршрутов API. (Post counter, Post Order).
- 3. Установка начального значения в схеме чисел. (Используя ‘Post Counter’).
- 4. Написание двух зависимых функций: Одна функция для числа, а другая для публикации New Order с новым числом.
- Заключение
1. Определение схем.
2. Построение и определение соответствующих маршрутов API. (Post counter, Post Order).
3. Установка начального значения в числовой схеме. (с помощью ‘Post Counter’).
4. Написание двух зависимых функций: Одна функция для номера, а другая для размещения Нового заказа с новым номером.
1. Определение схем.
Схема номера довольно проста, она имеет только одно свойство под названием «number» и ее значением будет Number: (строки 5-7).
Модели было дано имя «Счетчик».
import mongoose from "mongoose";
const Schema = mongoose.Schema;
const counter = new Schema({
number: Number,
});
mongoose.models = {};
const Counter = mongoose.model("Counter", counter);
export default Counter;
Схема ‘order’, очевидно, немного сложнее, но мы пока сосредоточимся только на свойстве order этой схемы, (строка 13).
import mongoose from "mongoose";
const Schema = mongoose.Schema;
const order = new Schema({
customerEmail: String,
dateAndTime: String,
specialNotesFromCustomer: String,
mealPrice: Number,
dishes: Array,
wasDelivered: Boolean,
wasCanceled: Array,
orderNum: Number,
});
mongoose.models = {};
const Order = mongoose.model("Order", order);
export default Order;
2. Построение и определение соответствующих маршрутов API. (Post counter, Post Order).
Теперь нам нужно было создать API-маршрут для отправки документа в коллекцию ‘counters’, чтобы иметь начальное число, которое мы могли бы в дальнейшем увеличивать с каждым новым заказом.
import connectDB from "../../middleware/mongodb";
import Counter from "../../models/countermodel"
const postInitialNumber = async (req, res) => {
if (req.method === "POST") {
const { number } = req.body;
if (number) {
try {
const counter = new Counter({
number
});
const counterCreated = await counter.save();
return res.status(200).send(counterCreated);
} catch (error) {
return res.status(500).send(error.message);
}
} else {
res.status(422).send("data_incomplete");
}
} else {
res.status(422).send("req_method_not_supported");
}
};
export default connectDB(postInitialNumber);
Это позволило нам решить, с какого числа начать подсчет. Вы можете начать с нуля, или со 100, или с любого другого числа, которое лучше всего подходит для ваших нужд.
(На самом деле, вы даже можете иметь более одной коллекции, что означает, что у вас может быть более одной системы подсчета, и вы можете использовать это для различения различных видов заказов).
3. Установка начального значения в схеме чисел. (Используя ‘Post Counter’).
Мы использовали Postman для того, чтобы установить наш счетчик, начинающийся с 10000:
Используя MongoDB Compass, мы отслеживали наш результат в коллекции ‘counters’:
4. Написание двух зависимых функций: Одна функция для числа, а другая для публикации New Order с новым числом.
Теперь, когда у нас было нужное начальное значение в базе данных, нам нужен был маршрут API, который увеличивал бы его на единицу. Мы использовали методы findOneAndUpdate() и $inc из mongoDB для установки маршрута.
Обратите внимание на строку 7: мы передаем в скобках аргументы; сначала пустые фигурные скобки, затем вложенный объект внутри другого объекта.
Внешний объект определяет метод, который является инкрементным. Внутренний объект определяет, над каким свойством и на сколько нужно выполнить метод. В нашем случае мы хотим добавить 1 к свойству ‘number’.
Более того, в строке 8 видно, что мы отправляем обратно только значение ‘number’, а не весь объект.
До сих пор мы создавали необходимые нам схемы и модели, а также маршруты API. Теперь мы хотели реализовать все это в компоненте «Лоток» и соединить бэкэнд с фронтэндом.
Мы сделали кнопку «Разместить заказ» и назначили ей функцию onClick.
<button onClick={() => newOrderNum()}> Place Order </button>
Эта кнопка фактически выполняет две функции, одну за другой.
Мы должны были настроить ее таким образом, потому что функция fetch — это асинхронная функция, и нам нужно, чтобы она завершилась, чтобы мы могли получить номер перед размещением нового заказа.
Первая функция получит новый номер заказа, а затем активирует вторую функцию, передав в качестве аргумента новый номер.
Обратите внимание, что в строках 25-27 мы передали API метод «PATCH».
Информация извлекается в строках 29-30. Номер в базе данных обновляетсяи мы получаем обратно номер, который был до этого.
В строке 31 мы присваиваем переменную номеру(«newOrderNum»), а в строке 32 вызываем вторую функцию, которая отправит весь заказ в нашу базу данных.
Вторая функция, HandleOrder, на первый взгляд может показаться более сложной, но мы сосредоточимся на ее элементе «номер заказа».
В строке 37 «HandleOrder» получает номер, а в строке 49 он присваивается свойству «orderNum» тела запроса.
В строках 53 — 60 запрос передается через маршрут к соответствующему API, и весь заказ размещается в базе данных.
Снова используя MongoDB Compass, мы проследили за результатом, на этот раз в коллекции ‘orders’:
вы можете видеть, что свойство ‘orderNum’ установлено на начальное значение, которое мы задали в начале.
Кроме того, число в коллекции «счетчики» увеличилось на 1 и готово для следующего заказа.
Заключение
Использование целой коллекции только для присвоения номеров заказов может показаться расточительным. Но это позволяет нам управлять остальной частью нашей базы данных с большей точностью и аккуратностью. Так что в долгосрочной перспективе это поможет нам быть более экономными в нашей работе и, следовательно, более продуктивными.
Спасибо, что прочитали! Надеюсь, это вам поможет.
Доступно для работы. Full Stack разработчик.
https://www.linkedin.com/in/gal-naim-גל-נעים-910460246/