PrimLagic

ساخت نرم‌افزار ویندوزی با Node.js و Prisma/SQLite: درس‌هایی که یاد گرفتیم

نویسنده علی عبداللهی · · ۲ دقیقه مطالعه

ساخت نرم‌افزار ویندوزی با Node.js و Prisma/SQLite: درس‌هایی که یاد گرفتیم

مدرسه‌ها معمولاً سرور ندارند؛ یک کامپیوتر ویندوزی در دفتر هست. به همین دلیل ClassBan طوری ساخته شد که با دوبار کلیک روی یک فایل اجرا شود. اینجا انتخاب‌ها و درس‌هایش را می‌نویسم.

معماری در یک نگاه

  • بک‌اند: Node.js با Express و TypeScript.
  • دیتابیس: SQLite از طریق Prisma؛ بدون نصب سرور دیتابیس.
  • فرانت‌اند: React با Vite که ساخته می‌شود و همراه بک‌اند سرو می‌شود.
  • بسته‌بندی: ابزار pkg کل برنامه را برای Node 18 روی ویندوز به یک فایل ClassBan.exe تبدیل می‌کند.

چرا SQLite؟

برای یک مدرسه، دیتابیس یک فایل است که می‌شود کپی کرد، بکاپ گرفت و جابه‌جا کرد. نیازی به نصب و راه‌اندازی PostgreSQL نیست. سه تنظیم مهم که در ClassBan روشن می‌شوند:

  • journal_mode = WAL برای این‌که خواندن و نوشتن هم‌زمان کمتر قفل شود.
  • busy_timeout = 5000 تا به‌جای خطای فوری «database is locked»، تا ۵ ثانیه منتظر بماند.
  • synchronous = NORMAL برای تعادل بین سرعت و ایمنی در حالت WAL.

نتیجه‌ی WAL این است که کنار فایل دیتابیس دو فایل دیگر هم پیدا می‌شود؛ بکاپ باید هر سه را بگیرد (توضیحش در مقاله‌ی بکاپ آمده).

Prisma با pkg: ظریف‌کاری دارد

Prisma یک موتور باینری دارد که باید کنار exe باشد. در تنظیمات pkg باید فایل‌های لازم را به‌صراحت در assets معرفی کنید، وگرنه برنامه روی سیستم خودتان کار می‌کند و روی سیستم مدرسه نه. قاعده‌ی من: هر بسته را روی یک ویندوز تمیز تست کن، نه فقط روی سیستم توسعه.

لایسنس و شناسه‌ی دستگاه

نسخه‌ی اصلی ClassBan با یک فایل لایسنس به یک دستگاه گره می‌خورد (با شناسه‌ی ماشین). این منطق در دمو عمداً نیست. نکته‌ی امنیتی: هر روش لایسنس که کلید ثابت یا الگوریتم قابل‌حدس در خودِ exe دارد، با زمان شکسته می‌شود؛ لایسنس را مانع قطعی ندانید.

چیزهایی که یاد گرفتیم

  1. مسیر فایل‌ها نسبت به exe، نه نسبت به پوشه‌ی جاری. دوبار کلیک و اجرا از Task Scheduler مسیر کاری متفاوتی دارند.
  2. لاگ را از روز اول بگذارید (ما از winston استفاده می‌کنیم)؛ وقتی مدرسه می‌گوید «کار نمی‌کند» فقط لاگ به شما می‌گوید چرا.
  3. تاریخ شمسی را در یک جا تبدیل کنید، نه پراکنده در کد.
  4. صف پیامک و تلاش مجدد را زود اضافه کنید (توضیح).
  5. رمز و کلید همیشه از متغیر محیطی بیاید، نه از کد.

کجا کم آورد

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

Node.jsPrismaSQLiteویندوز