Node Master
چند روزی هست که Node 20.10 LTS منتشر شده یکی دوتا تغییر جالب داشته که برسی میکنیم این تغییرات رو باهم.
یکی از نکات جالب اضافه شدن Web Api مربوط به WebSocket کلاینت.
اگر این رو با node ران کنید به ارور میخورید و میگه WebSocket وجود نداره.
اما اگر با فلگ --experimental-websocket اجرا کنید WebSocket به global object اضافه میشه.
#NodeUpdate
#20_10
const wsClient = new WebSocket("ws://websocketServer:7000")اگر این رو با node ران کنید به ارور میخورید و میگه WebSocket وجود نداره.
اما اگر با فلگ --experimental-websocket اجرا کنید WebSocket به global object اضافه میشه.
node --experimental-websocket main.js
#NodeUpdate
#20_10
👍5
فلگ جدید که اضافه شده میتونید default module system رو عوض کنید. قبل از این داستان باید داخل package.json مقدار type رو روی module بزارید تا بتونید پروژه خودتون رو با ESM اجرا کنید ولی با این فلگ دیگه نیازی به این کار نیست.
شما اگر این رو اجرا کنید بدوت اضافه کرد type: module در package.json یا بدون .mjs به عنوان فرمت به ارور میخورید چون در حال حاظر CommonJS در Node پیش فرض هست.
حالا برای عوض کردن این پیشفرض میتونید این کار کنید.
#NodeUpdate
// main.js
import crypto from "node:crypto"
شما اگر این رو اجرا کنید بدوت اضافه کرد type: module در package.json یا بدون .mjs به عنوان فرمت به ارور میخورید چون در حال حاظر CommonJS در Node پیش فرض هست.
حالا برای عوض کردن این پیشفرض میتونید این کار کنید.
node --experimental-default-type module main.js
#NodeUpdate
👍4
من لینکدین خیلی فعال نیستم و یهویی دیدم یکی از دوستان اینجا پست من رو اونجا اشتراک گذاشته.
این که براتون مفید و جالب هست خیلی خوشحال شدم و انگیزه گرفتم. از لطف شما متشکرم❤️
این که براتون مفید و جالب هست خیلی خوشحال شدم و انگیزه گرفتم. از لطف شما متشکرم❤️
👍9
Forwarded from Maede
درمورد thread pool pattern که سرچ کردم به یه سورس گیت رسیدم که میاد یه pool از worker ها ایجاد میکنه و باید فقط تسک ها رو مدیریت کرد. و لینک ش رو میذارم اگه کسی بهش نیاز پیدا کرد یا خواست سورسش رو بررسی کنه:
https://github.com/josdejong/workerpool
https://github.com/josdejong/workerpool
👍2
Node Master
فلگ جدید که اضافه شده میتونید default module system رو عوض کنید. قبل از این داستان باید داخل package.json مقدار type رو روی module بزارید تا بتونید پروژه خودتون رو با ESM اجرا کنید ولی با این فلگ دیگه نیازی به این کار نیست. // main.js import crypto from "node:crypto"…
یک flag دیگه که اصلا دیگه حتی نیازی به این کار هم نیست و در نسخه 20.10 اضافه شده.
خودش تشخیص میده که آیا از سینتکس ES Module در پروژه شما استفاده شده یا خیر.
و اگر استفاده شده باشه همه چی out of the box کار میکنه
#NodeUpdate
node --experimental-detect-module main.js
خودش تشخیص میده که آیا از سینتکس ES Module در پروژه شما استفاده شده یا خیر.
و اگر استفاده شده باشه همه چی out of the box کار میکنه
#NodeUpdate
👍4
خیلی از دوستان از nodemon استفاده میکنن برای development تا وقتی تغییری در کد ایجاد میکنن سرور متوجه میشه و ری استرات میشه تا آخرین تغییرات رو داشته باشید.
از ورژن های 16.19.0 و 18.11.0 یک flag به صورت experimental اضافه شده که این کار رو براتون انجام میده بدون استفاده از Nodemon.
یکجورایی تقریبا دیگ شاهد Deprecate شدن Nodemon در آینده احتملا خواهیم بود.
#Tip
از ورژن های 16.19.0 و 18.11.0 یک flag به صورت experimental اضافه شده که این کار رو براتون انجام میده بدون استفاده از Nodemon.
node --watch main.js
یکجورایی تقریبا دیگ شاهد Deprecate شدن Nodemon در آینده احتملا خواهیم بود.
#Tip
👍15
سلام رفقا ارادت. از این به بعد آپدیت های جالب خبرنامه #AwesomeNodeWeekly رو با این هشتگ خواهیم داشت.
👍6
- دوستانی که از Node 16 در حال استفاده روی پروداکشن هستن توجه کنید که بزودی این نسخه به آخر عمر خودش نزدیک میشه و به فکر آپدیت کردن به نسخه LTS جدید باشید.
نسخه Node 16 در تاریخ September 11, 2023 به پایان عمر خودش میرسه.
- کتاب خانه محبوب Mongoose نسخه 8 منتشر شد و بزودی آپدیت های مهم این کتاب خونه رو نگاهی خواهیم انداخت.
#AwesomeNodeWeekly
#NodeUpdate
نسخه Node 16 در تاریخ September 11, 2023 به پایان عمر خودش میرسه.
- کتاب خانه محبوب Mongoose نسخه 8 منتشر شد و بزودی آپدیت های مهم این کتاب خونه رو نگاهی خواهیم انداخت.
#AwesomeNodeWeekly
#NodeUpdate
👍11
یکی از نکاتی که خیلی از دوستان میبینیم انجام میدن استفاده از body parser در پروژه های express هست.
نکته ای که وجود داره express از در ورژن 4.16 و 4.17 به صورت پیشفرض middleware های این پکیج رو داخل خودش داره و نیازی نیست body-parser رو اصلا نصب کنید!
یعنی کد زیر رو
لیست middleware هایی که در express به صورت پیش فرض برای گرفتن دیتا وجود دارد.
- express.json 4.16
- express.raw 4.17
- express.text 4.17
- express.urlencoded 4.16
#Express
#Tip
نکته ای که وجود داره express از در ورژن 4.16 و 4.17 به صورت پیشفرض middleware های این پکیج رو داخل خودش داره و نیازی نیست body-parser رو اصلا نصب کنید!
یعنی کد زیر رو
import express from "express"میتونید راحت تبدیل کنید به این کد
import bodyParser from "body-parser"
const app = express()
app.use(bodyParser.json())
import express from "express";تا جایی که میتونید سعی کنید از پکیج های کمتری استفاده کنید اینطور میتونید پروژه تمیز تر و سبک تری داشته باشید.
const app = express();
app.use(express.json());
لیست middleware هایی که در express به صورت پیش فرض برای گرفتن دیتا وجود دارد.
- express.json 4.16
- express.raw 4.17
- express.text 4.17
- express.urlencoded 4.16
#Express
#Tip
👍15
Node Master
بزارید ادامه این بحث رو با توضیح کوتاهی از Process شروع کنیم. Process چیست؟ در حقیقت Process یک instace از یک برنامه در حال اجرا که معمولا روی RAM جا دارد. برنامه در حال اجرا روی سیستم عامل برای اجرا دستورات خود نیاز به منابعی از قبیل حافظه و cpu time دارد.…
در ادامه مبحث Cluster Module و IPC یکی از مرسوم ترین روش های IPC استفاده از Signal برای فرستادن یک سری پیام های خاص به یک Process هست. به عنوان مثال از معروف ترین Singal ها که همیشه استفاده میکنید و ممکن هست بهشون توجه نکرده باشید SIGINT و SIGKILL میباشد.
ولی سوال اینجاس این Signal ها رو چطور ما استفاده میکنیم بدون این که متوجه بشیم؟
شما وقتی یک برنامه NodeJS یا هر Process دیگه ای داشته باشید وقتی در Terminal کلید Ctrl + C رو میزنید تا برنامه رو ببنید از Terminal ما که یکجورایی Parent Process ما هست یک سیگنال SIGINT به Node Process که Child process ما هست ارسال میشه.
یک روش دیگه برای ارسال SIGINT فرستادن signal از طریق kill هست.
حالا بریم با یک مثال توضیحات بیشتری رو بدیم
نکته اینجاس که ما میتونیم روی برنامه های خودمون یک سری listener داشته باشیم که به این سیگنال ها گوش میکنند که روی process object ما میتونیم این ها رو register کنیم.
حالا بزارید اینجا خود signal های SIGINT و SIGKILL رو بیشتر توضیح بدم
- سیگنال SIGINT به Process میگه قرار بسته بشی و اگر نیاز داره جایی تمیز کاری انجام بدی مثل بستن کانکشن به دیتابیس بستن file denoscriptor ها لاگ کردن یکسری چیزها این کارا رو انجام بده و بعد خودمون باید با process.exit خارج بشیم. نکته این هست که ما میتونیم به این سیگنال گوش نکنیم و نادیده بگیریم یعنی اگر ما خط process.exit رو نداشته باشیم process همچنان به عمر خودش ادامه میده. یک سیگنال دیگ که خیلی شبیه به SIGINT هست SIGTERM نام داره که میتونید خودتون برید چک کنید کنجکاوی جالبی میتونه براتون باشه.
- سیگنال SIGKILL سیگنالی هست که شما به هیچ عنوان نمیتونید capture کنید و یجورایی سیستم عامل process شما رو خفه میکنه بدون این که بهش خبر بده. سیستم عامل با این سیگنال میگه برای من مهم نیست که تو clean up کردی یا نه من میخوام تو رو بکشم!
به عنوان مثال در این برنامه خط process.exit رو حذف کنید و با ctrl+c چنتا SIGINT بفرستید. بعد برای کشتن process به صورت کلی از دستور زیر برای فرستادن SIGKILL استفاده کنید و Process رو خفه کنید.
در معماری master-slave در cluster module از این سیگنال ها استفاده هایی میشه و اینجا ما مقدمه ای کلی راجع به این سیگنال ها داشتیم که کلا چی هستن. در ادامه سعی میکنیم با مثال روی cluster module با این سیگنال ها بازی کنیم. و یکم بیشتر باهاشون آشنا بشیم.
ولی سوال اینجاس این Signal ها رو چطور ما استفاده میکنیم بدون این که متوجه بشیم؟
شما وقتی یک برنامه NodeJS یا هر Process دیگه ای داشته باشید وقتی در Terminal کلید Ctrl + C رو میزنید تا برنامه رو ببنید از Terminal ما که یکجورایی Parent Process ما هست یک سیگنال SIGINT به Node Process که Child process ما هست ارسال میشه.
یک روش دیگه برای ارسال SIGINT فرستادن signal از طریق kill هست.
kill -2 <PID>
حالا بریم با یک مثال توضیحات بیشتری رو بدیم
// main.js
console.log("PID : ", process.pid);
process.on("SIGINT", (s) => {
//clean up code
console.log("sigint\n");
process.exit(0);
});
setInterval(() => {}, 1000);
نکته اینجاس که ما میتونیم روی برنامه های خودمون یک سری listener داشته باشیم که به این سیگنال ها گوش میکنند که روی process object ما میتونیم این ها رو register کنیم.
حالا بزارید اینجا خود signal های SIGINT و SIGKILL رو بیشتر توضیح بدم
- سیگنال SIGINT به Process میگه قرار بسته بشی و اگر نیاز داره جایی تمیز کاری انجام بدی مثل بستن کانکشن به دیتابیس بستن file denoscriptor ها لاگ کردن یکسری چیزها این کارا رو انجام بده و بعد خودمون باید با process.exit خارج بشیم. نکته این هست که ما میتونیم به این سیگنال گوش نکنیم و نادیده بگیریم یعنی اگر ما خط process.exit رو نداشته باشیم process همچنان به عمر خودش ادامه میده. یک سیگنال دیگ که خیلی شبیه به SIGINT هست SIGTERM نام داره که میتونید خودتون برید چک کنید کنجکاوی جالبی میتونه براتون باشه.
- سیگنال SIGKILL سیگنالی هست که شما به هیچ عنوان نمیتونید capture کنید و یجورایی سیستم عامل process شما رو خفه میکنه بدون این که بهش خبر بده. سیستم عامل با این سیگنال میگه برای من مهم نیست که تو clean up کردی یا نه من میخوام تو رو بکشم!
به عنوان مثال در این برنامه خط process.exit رو حذف کنید و با ctrl+c چنتا SIGINT بفرستید. بعد برای کشتن process به صورت کلی از دستور زیر برای فرستادن SIGKILL استفاده کنید و Process رو خفه کنید.
kill -9 <PID>
در معماری master-slave در cluster module از این سیگنال ها استفاده هایی میشه و اینجا ما مقدمه ای کلی راجع به این سیگنال ها داشتیم که کلا چی هستن. در ادامه سعی میکنیم با مثال روی cluster module با این سیگنال ها بازی کنیم. و یکم بیشتر باهاشون آشنا بشیم.
👍8
مدتی هست دارم سعی میکنم یک وب سایت راه اندازی کنم تا مطالب رو با نظم بیشتری بتونیم داشته باشیم.
آیا جمع کردن موضوعات همه در یک وب سایت براتون مفید هست یا خیر؟
آیا جمع کردن موضوعات همه در یک وب سایت براتون مفید هست یا خیر؟
Anonymous Poll
75%
بله
11%
خیر
14%
نظری ندارم
این تکه کد از ریپو اصلی NestJS هست.
https://github.com/nestjs/nest/blob/master/packages/core/package.json
نکته ای که وجود داره peerDependencies هست.
کلا peerDependencies کمتر راجع بهشون صحبت شده و نکته اینجاس که ممکن هست ندونستن این ویژگی ریز باعث بشه هفته ها دنبال باگی بگردید که اصلا وجود نداره.
این باگ ترسناک باعث تغییر رفتار instanceof میشه! و مخصوصا در پروژه های NestJS بخاطر استفاده سنگین از peerDependencies ها هرلحظه در کمین نشسته.
و این که replicate کردن این باگ و برسی این موضوع چون به ساختار Memory و load شدن class ها در حافظه خیلی ربط داره و دید جالبی از حافظه به شما میده.
در ادامه به صورت خیلی کلی و خلاصه راجع به کلیت peerDependencies صحبت میکنیم. ولی در آینده حتما یکی از موضوعاتی هست که درموردش عمیق صحبت خواهیم کرد.
صرفا هدف از این پست ایجاد کنجکاوی برای شما و مطالعه درمورد این موضوع در صورت علاقه.
#Tip
https://github.com/nestjs/nest/blob/master/packages/core/package.json
نکته ای که وجود داره peerDependencies هست.
کلا peerDependencies کمتر راجع بهشون صحبت شده و نکته اینجاس که ممکن هست ندونستن این ویژگی ریز باعث بشه هفته ها دنبال باگی بگردید که اصلا وجود نداره.
این باگ ترسناک باعث تغییر رفتار instanceof میشه! و مخصوصا در پروژه های NestJS بخاطر استفاده سنگین از peerDependencies ها هرلحظه در کمین نشسته.
و این که replicate کردن این باگ و برسی این موضوع چون به ساختار Memory و load شدن class ها در حافظه خیلی ربط داره و دید جالبی از حافظه به شما میده.
در ادامه به صورت خیلی کلی و خلاصه راجع به کلیت peerDependencies صحبت میکنیم. ولی در آینده حتما یکی از موضوعاتی هست که درموردش عمیق صحبت خواهیم کرد.
صرفا هدف از این پست ایجاد کنجکاوی برای شما و مطالعه درمورد این موضوع در صورت علاقه.
#Tip
👍5
به صورت کلی Stream ها در NodeJS خیلی کمتر شناخته شده هستند هرچند بخش اساسی و فلسفه Node رو تشکیل دادن. باز هم با این وجود بخش هایی از Stream و Event ها در NodeJS باز کمتر از بقیه شناخته شده اند.
یکی از این موضوعات ویژگی استفاده از event ها به صورت promise api و listen کردن روی stream ها و event ها.
بزارید با مثال این موضوع رو بیشتر باز کنم.
قسمت اول مشخص هست و نیازی به توضیح نداره در قسمت دوم به صورت async روی "message" یک string و یک number ارسال میکنیم تا در پارت سوم با استفاده از متد on روی emitter ایجاد شده در پارت اول listen کنیم و دیتا رو بفرستیم روی stdout.
این استایل کد خیلی مرسوم هست در NodeJS و همه با اون آشنایی داریم. ولی اگر همین رو بخوایم ریفکتور کنیم به شکلی که کمتر میبینیم چطور میشه؟
تمام قسمت های کد به همون شکل قبل هست به جز پارت ۳ و یک import جدید با نام on که در ادامه توضیح خواهیم داد.
در کتابخانه "node:events" چندین دوتا فانکشن وجود داره به اسم on و once که معادل متد های on و once روی evetemitter ها هست ولی خب متفاوت عمل میکنند. بزارید اینطور بگم هدف ها یکی هست ولی روش انجام کار متفاوت هست و این موضوع بخاطر این هست که در هرکدوم یک سری کارا رو میشه راحت تر انجام داد و البته این موضوع خارج از این بحث میباشد.
در ساده ترین حالت ممکن این فانکشن یک object از event emitter و نام رویدادی که قراره listen بشه رو دریافت میکنه ( همینطور که میدونید stream ها هم event emitter هستند)
و یک AsyncIterator به شما برمیگردونه.
حالا این که AsyncIterator چیست و چرا خودش یک مبحث با کلی توضیحات هست و اینجا وارد این موضوع نخواهیم شد و در همین که بدونیم با استفاده از AsyncIterator میتونیم همچین کار هایی رو انجام بدیم کافی هست.
#Tip
یکی از این موضوعات ویژگی استفاده از event ها به صورت promise api و listen کردن روی stream ها و event ها.
بزارید با مثال این موضوع رو بیشتر باز کنم.
import { EventEmitter } from "node:events";
// PART 1
const emitter = new EventEmitter();
// PART 2
process.nextTick(() => {
emitter.emit("message", 543);
emitter.emit("message", "Hello NodeMaster");
});
// PART 3
emitter.on("message", (data) => {
console.log("from event:", data);
});قسمت اول مشخص هست و نیازی به توضیح نداره در قسمت دوم به صورت async روی "message" یک string و یک number ارسال میکنیم تا در پارت سوم با استفاده از متد on روی emitter ایجاد شده در پارت اول listen کنیم و دیتا رو بفرستیم روی stdout.
این استایل کد خیلی مرسوم هست در NodeJS و همه با اون آشنایی داریم. ولی اگر همین رو بخوایم ریفکتور کنیم به شکلی که کمتر میبینیم چطور میشه؟
import { EventEmitter, on } from "node:events";
// PART 1
const emitter = new EventEmitter();
// PART 2
process.nextTick(() => {
emitter.emit("message", 543);
emitter.emit("message", "Hello NodeMaster");
});
// PART 3
for await (const [data] of on(emitter, "message")) {
console.log("from event:", data);
}تمام قسمت های کد به همون شکل قبل هست به جز پارت ۳ و یک import جدید با نام on که در ادامه توضیح خواهیم داد.
در کتابخانه "node:events" چندین دوتا فانکشن وجود داره به اسم on و once که معادل متد های on و once روی evetemitter ها هست ولی خب متفاوت عمل میکنند. بزارید اینطور بگم هدف ها یکی هست ولی روش انجام کار متفاوت هست و این موضوع بخاطر این هست که در هرکدوم یک سری کارا رو میشه راحت تر انجام داد و البته این موضوع خارج از این بحث میباشد.
در ساده ترین حالت ممکن این فانکشن یک object از event emitter و نام رویدادی که قراره listen بشه رو دریافت میکنه ( همینطور که میدونید stream ها هم event emitter هستند)
و یک AsyncIterator به شما برمیگردونه.
حالا این که AsyncIterator چیست و چرا خودش یک مبحث با کلی توضیحات هست و اینجا وارد این موضوع نخواهیم شد و در همین که بدونیم با استفاده از AsyncIterator میتونیم همچین کار هایی رو انجام بدیم کافی هست.
#Tip
👍7
خیلی خیلش تشکر میکنم از شما دوستان که به بنده افتخار دادین و ۲۰۰ نفر شد چنل 🎉
و این که یک خواهش از شما دوستان داشتم.
اگر مطالب کانال براتون مفیده من داخل لینکدین هم اینها رو به اشتراک میزارم. واقعا ممنون میشم اگر اونجا لایک و repost کنید. دوباره ازتون تشکر میکنم واقعا باورم نمیشه ۲۰۰ نفر شدیم 🎉
https://www.linkedin.com/feed/update/urn:li:activity:7137731168061333504/
و این که یک خواهش از شما دوستان داشتم.
اگر مطالب کانال براتون مفیده من داخل لینکدین هم اینها رو به اشتراک میزارم. واقعا ممنون میشم اگر اونجا لایک و repost کنید. دوباره ازتون تشکر میکنم واقعا باورم نمیشه ۲۰۰ نفر شدیم 🎉
https://www.linkedin.com/feed/update/urn:li:activity:7137731168061333504/
Linkedin
Iman Hosseini Pour on LinkedIn: #nodejs
“Streams are Node’s best and most misunderstood idea.” Even Dan Abramov
در این که Stream ها در #NodeJS به دلیل سخت بودن درکشون کمتر شناخته شده هستند شکی نیست…
در این که Stream ها در #NodeJS به دلیل سخت بودن درکشون کمتر شناخته شده هستند شکی نیست…
👍13
قرار بر این بود که درمورد تمام موضوعات BackEnd صحبت کنیم. ولی خب تا به امروز فقط درمورد Runtime های مربوط به js بیشتر NodeJS صحبت کردیم. امروز نگاهی به یکی از ویژگی های بسیار خوب #postgres اشاره میکنیم.
شما میتونید یک فیلد با تایپ JSON تعریف کنید و دیتا رو به صورت شبیه به document در mongodb ذخیر کنید. نکته جالب این هست که میتونید هم روی این JSON ها Index ایجاد کنید هم query های خوبی بزنید و کلا چون به صورت native روی postgres پیاده سازی شده تقریبا هرکاری میتونید کنید.
شما به این طریق میتوانید یک table ایجاد کنید که در کنار ساختار نرمال خودش میتونه یک json document در خودش داشته باشه به عنوان فیلد که میشه اون رو به هرشکلی که میخواید query بزنید. حالا به مثال های زیر توجه کنید.
فرض کنید فقط میخواهیم نام های مشتریان رو از این json ها بکشیم بیرون.
به ->> دقت کنید. این اپراتور شبیه به dot در js در عمل میکنه یا زبان ها دیگه. البته دو مدل داریم
-> اپراتور به صورت jsonb دیتا رو برمیگردونه.
->> اپراتور به صورت text دیتا رو به شما میرسونه.
حالا ما میخوایم که qty که خودش داخل یک داکیومنت دیگه هست رو برگردونیم
نکته این هست که اپراتور ->> دیتا رو به صورت text برمیگردونه درصورتی که این فیلد عدد ذخیره میکنه و ممکنه بخوام عملیات شرطی یا aggregate هایی که روی اعداد میشه زد انجام بدم. برای این کار میتونیم از CAST استفاده کنیم. شبیه به Type Casting در زبان ها برنامه نویسی مثل java , go و حتی typenoscript هست.
در ایجا شرط گذاشتیم اونهایی که بزرگتر یا مساوی 2 باشند که اگر اجرا کنید به زیبایی کار میکنه.
ذخیره کردن JSON در Postgres در یک حالت هایی به شدت قدرتمند هست و نیاز شما به mongodb رو حذف میکنه. البته این جمله رو در همه مواقع صدرصد فرض نکنید و باید با توجه به پیچدگی مسئله تصمیم بگیرید.
در پست بعد یک مسئله مطرح میکنم که به عنوان BackEnd Dev باید بدونید چون که میتونه سوال مصاحبه باشه و خیلی در دیزاین دیتابیس بهتون کمک میکنه و مزیت ذخیره کردن JSON در Postgres رو با یک مثال که در دنیای واقعی استفاده میشه خواهید دید.
#Tip #Postgres
شما میتونید یک فیلد با تایپ JSON تعریف کنید و دیتا رو به صورت شبیه به document در mongodb ذخیر کنید. نکته جالب این هست که میتونید هم روی این JSON ها Index ایجاد کنید هم query های خوبی بزنید و کلا چون به صورت native روی postgres پیاده سازی شده تقریبا هرکاری میتونید کنید.
CREATE TABLE orders (
id serial NOT NULL PRIMARY KEY,
info json NOT NULL
);
INSERT INTO orders (info)
VALUES('{ "customer": "imanhpr", "items": {"product": "food","qty": 24}}'),
('{ "customer": "ali", "items": {"product": "bike","qty": 1}}'),
('{ "customer": "hasan", "items": {"product": "car","qty": 2}}');
شما به این طریق میتوانید یک table ایجاد کنید که در کنار ساختار نرمال خودش میتونه یک json document در خودش داشته باشه به عنوان فیلد که میشه اون رو به هرشکلی که میخواید query بزنید. حالا به مثال های زیر توجه کنید.
فرض کنید فقط میخواهیم نام های مشتریان رو از این json ها بکشیم بیرون.
SELECT info ->> 'customer' as customer FROM orders;
به ->> دقت کنید. این اپراتور شبیه به dot در js در عمل میکنه یا زبان ها دیگه. البته دو مدل داریم
-> اپراتور به صورت jsonb دیتا رو برمیگردونه.
->> اپراتور به صورت text دیتا رو به شما میرسونه.
حالا ما میخوایم که qty که خودش داخل یک داکیومنت دیگه هست رو برگردونیم
SELECT info ->> 'customer' AS customer ,
info -> 'items' ->> 'qty' AS qty
FROM orders;
نکته این هست که اپراتور ->> دیتا رو به صورت text برمیگردونه درصورتی که این فیلد عدد ذخیره میکنه و ممکنه بخوام عملیات شرطی یا aggregate هایی که روی اعداد میشه زد انجام بدم. برای این کار میتونیم از CAST استفاده کنیم. شبیه به Type Casting در زبان ها برنامه نویسی مثل java , go و حتی typenoscript هست.
SELECT info ->> 'customer' AS customer,
info -> 'items' ->> 'qty' AS qty
FROM orders
WHERE CAST(info -> 'items' ->> 'qty' AS INTEGER) >= 2;
در ایجا شرط گذاشتیم اونهایی که بزرگتر یا مساوی 2 باشند که اگر اجرا کنید به زیبایی کار میکنه.
ذخیره کردن JSON در Postgres در یک حالت هایی به شدت قدرتمند هست و نیاز شما به mongodb رو حذف میکنه. البته این جمله رو در همه مواقع صدرصد فرض نکنید و باید با توجه به پیچدگی مسئله تصمیم بگیرید.
در پست بعد یک مسئله مطرح میکنم که به عنوان BackEnd Dev باید بدونید چون که میتونه سوال مصاحبه باشه و خیلی در دیزاین دیتابیس بهتون کمک میکنه و مزیت ذخیره کردن JSON در Postgres رو با یک مثال که در دنیای واقعی استفاده میشه خواهید دید.
#Tip #Postgres
👍7
Node Master
https://www.linkedin.com/posts/alitorki_hirring-opentowork-activity-7137716965212655616-ser6?utm_source=share&utm_medium=member_android
از این به بعد موقعیت های شغلی هم با تگ #Work برای Nodejs میزارم براتون
👍7
Node Master
قرار بر این بود که درمورد تمام موضوعات BackEnd صحبت کنیم. ولی خب تا به امروز فقط درمورد Runtime های مربوط به js بیشتر NodeJS صحبت کردیم. امروز نگاهی به یکی از ویژگی های بسیار خوب #postgres اشاره میکنیم. شما میتونید یک فیلد با تایپ JSON تعریف کنید و دیتا رو…
خب بریم سراغ مسئله واقعی که ممکنه براتون روی پروژه هاتون خیلی پیش بیاد و استفاده از این تکنیک میتونه کارتون رو راحت تر کنه.
یک فروشگاه آنلاین مثل دیجیکالا رو در نظر بگیرید که محصولات زیادی برای فروش از دسته بندی های مختلف دارد. حالا شما قصد دارید ویژگی های خاص برای هر دسته از محصول رو ذخیره کنید و این هم در نظر بگیرید که ویژگی هایی که برای موبایل ذخیره میشود کاملا با ويژگی هایی که برای دفتر نقاشی ذخیره میشود متفاوت است.
حالا از شما میخواهند که دیتابیسی طراحی کنید که در قبال هر محصول خاص ویژگی های خاص خودش با مقادیر خاصش رو ذخیره کنید. مثال:
موبایل :
- صفحه نمایش
- شبکه ارتباطی
- پردازنده
دفتر
- نوع کاغذ
- تعداد برگ
دو روش برای انجام دادن این کار وجود داره. اولین روش رو که بالاتر اشاره کردیم. دومین روش که روش سخت تری هست و در دیتابیس های SQL استفاده میشه چالش داره و سوال مصاحبه ای هست.
سعی کنید روش SQL رو پیدا کنید و زیر این پست کامنت بزارید.
راهنمایی : یک پترن خیلی پر استفاده در SQL هست با نام مشخص.
#challenge
یک فروشگاه آنلاین مثل دیجیکالا رو در نظر بگیرید که محصولات زیادی برای فروش از دسته بندی های مختلف دارد. حالا شما قصد دارید ویژگی های خاص برای هر دسته از محصول رو ذخیره کنید و این هم در نظر بگیرید که ویژگی هایی که برای موبایل ذخیره میشود کاملا با ويژگی هایی که برای دفتر نقاشی ذخیره میشود متفاوت است.
حالا از شما میخواهند که دیتابیسی طراحی کنید که در قبال هر محصول خاص ویژگی های خاص خودش با مقادیر خاصش رو ذخیره کنید. مثال:
موبایل :
- صفحه نمایش
- شبکه ارتباطی
- پردازنده
دفتر
- نوع کاغذ
- تعداد برگ
دو روش برای انجام دادن این کار وجود داره. اولین روش رو که بالاتر اشاره کردیم. دومین روش که روش سخت تری هست و در دیتابیس های SQL استفاده میشه چالش داره و سوال مصاحبه ای هست.
سعی کنید روش SQL رو پیدا کنید و زیر این پست کامنت بزارید.
راهنمایی : یک پترن خیلی پر استفاده در SQL هست با نام مشخص.
#challenge
👍4
یک بلاگ پست زیبا از github که درمورد استفاده از MySql به عنوان یک دیتابیس اصلی در اون حجم توضیح میده.
باتوجه به این که scale کردن دیتابیس هایی مثل postgres و mysql چالش های زیادی دارن این بلاگ پست ارزش خیلی زیاده داره
https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/
(متاسفانه وقت ندارم با جزیات باهم برسیش کنیم ولی خب خودتون بخونید واقعا خوبه)
باتوجه به این که scale کردن دیتابیس هایی مثل postgres و mysql چالش های زیادی دارن این بلاگ پست ارزش خیلی زیاده داره
https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/
(متاسفانه وقت ندارم با جزیات باهم برسیش کنیم ولی خب خودتون بخونید واقعا خوبه)
The GitHub Blog
Upgrading GitHub.com to MySQL 8.0
GitHub uses MySQL to store vast amounts of relational data. This is the story of how we seamlessly upgraded our production fleet to MySQL 8.0.
👍4