وبلاگ نت‌آرامآموزش، تجربه و راهکارهای زیرساخت

متغیر محیطی Node.js در هاست undefined است؛ قدم‌به‌قدم درستش کنیم

تنظیم متغیرهای محیطی Node.js در پنل، تشخیص تفاوت برنامه و ترمینال، استفاده امن از dotenv و آزمون بدون نمایش رمزها.

انتشار:
توسط تیم فنی نت‌آرام
۷ دقیقه زمان مطالعه
۰ دیدگاه
محتوای تخصصی، ساده و کاربردی
هماهنگ با هویت حرفه‌ای نت‌آرام
بازگشت به لیست مقالات
تصویر شاخص مقاله متغیر محیطی Node.js در هاست undefined است؛ قدم‌به‌قدم درستش کنیم در وبلاگ نت‌آرام
محتوای آموزشی وبلاگ نت‌آرام
برنامه Node.js روی رایانه شما به دیتابیس یا سرویس ایمیل وصل می‌شود، اما روی هاست مقدار یکی از تنظیمات آن undefined است. گاهی خطا بلافاصله بعد از انتشار ظاهر می‌شود و گاهی فقط یک بخش، مانند ارسال پیام، کار نمی‌کند. علت رایج این است که مقدار موردنیاز به برنامه اجراشده روی هاست نرسیده، نامش دقیقاً یکسان نیست یا برنامه پیش از بارگذاری تنظیمات آن را خوانده است.
در این آموزش یک مقدار آزمایشی غیرمحرمانه تعریف می‌کنیم و مسیر رسیدن آن به برنامه را می‌بینیم. پس از اطمینان، همان روش را برای تنظیمات واقعی به کار می‌بریم؛ بدون اینکه رمز یا توکن را روی صفحه عمومی یا داخل لاگ چاپ کنیم. مثال‌ها برای برنامه Node.js روی هاست لینوکسی با پنل مدیریت برنامه هستند و نام گزینه‌های پنل ممکن است فرق کند.

متغیر محیطی چیست؟

برنامه می‌تواند بعضی تنظیمات را از محیط اجرایی بخواند، به‌جای آنکه همه آن‌ها در کد نوشته شوند. در Node.js این مقادیر با process.env در دسترس‌اند. مثلاً:
کد / دستورconsole.log(process.env.APP_REGION);
اگر APP_REGION در محیط همان پردازش تعریف شده باشد، مقدارش چاپ می‌شود و اگر وجود نداشته باشد معمولاً undefined است. نام متغیرها در لینوکس به بزرگی و کوچکی حروف حساس‌اند؛ APP_REGION با app_region یکی نیست. مقدارها نیز در محیط به شکل متن می‌رسند؛ عدد و حالت درست یا نادرست را باید در کد با دقت تبدیل کنید.
فرمان بالا برای یک مقدار بی‌خطر مناسب است. هیچ‌وقت process.env کامل، رمز دیتابیس، کلید API یا توکن را برای آزمایش در صفحه عمومی، تصویر یا گزارش مشترک چاپ نکنید.

۱. نام موردنیاز و نشانه خطا را پیدا کنید

در گزارش برنامه، خطا و زمانش را ببینید. اگر خطا درباره اتصال دیتابیس است، خالی‌بودن متغیر فقط یکی از احتمال‌هاست؛ رمز اشتباه، نام میزبان یا دسترسی شبکه هم می‌توانند باعث شکست شوند. در کد برنامه نام دقیق متغیر موردنیاز، مانند DATABASE_URL، را پیدا کنید و فقط نام آن را یادداشت کنید.
در cPanel، Setup Node.js App یا بخش معادل مدیریت برنامه را باز کنید. مطمئن شوید دامنه و مسیر Application root مربوط به همان برنامه مشکل‌دار هستند. نسخه Node.js، حالت اجرا و بخشی با عنوان Environment variables یا نام مشابه را پیدا کنید. وجود و جای این بخش به پنل و تنظیم سرویس وابسته است. اگر چند برنامه دارید، تنظیم برنامه اول لزوماً به برنامه دوم نمی‌رسد.

۲. تفاوت ترمینال و برنامه وب را بشناسید

اگر Terminal یا SSH حساب شما فعال است، می‌توانید با یک متغیر بی‌خطر رفتار پوسته را امتحان کنید:
کد / دستورAPP_REGION=tehran node -e 'console.log(process.env.APP_REGION)' node -e 'console.log(process.env.APP_REGION ?? "missing")'
فرمان اول فقط برای همان اجرای Node.js مقدار موقت tehran می‌گذارد و باید آن را چاپ کند. فرمان دوم یک پردازش تازه اجرا می‌کند و اگر متغیر در محیط پوسته تعریف نشده باشد، missing می‌نویسد. این آزمایش نشان می‌دهد هر پردازش محیط خود را دارد؛ تغییر موقت در ترمینال به معنی تغییر محیط برنامه‌ای که پنل پیش‌تر اجرا کرده نیست.
اگر نسخه Node.js انتخاب‌شده برای برنامه با نسخه ترمینال فرق دارد، فرمان ورود به محیط برنامه را از پنل کپی کنید و ابتدا آن را اجرا کنید. برای دیدن نسخه مفسر فعال:
کد / دستورnode --version which node
اگر which موجود نیست، command -v node را امتحان کنید. نسخه و مسیر درست مفیدند، اما حتی پس از فعال‌سازی محیط، متغیرهای خاص برنامه وب ممکن است فقط هنگام اجرای برنامه توسط پنل اضافه شوند.

۳. یک مقدار آزمایشی در پنل تعریف کنید

در بخش متغیرهای محیطی همان برنامه، کلید APP_REGION و مقدار نمونه tehran را اضافه و ذخیره کنید. از متغیری با این نام فقط در صورتی استفاده کنید که در برنامه شما کاربرد دیگری نداشته باشد. سپس با دکمه Restart همان برنامه را مجدداً راه‌اندازی کنید؛ یک پردازش قدیمی معمولاً تغییر محیط والد را خودبه‌خود دریافت نمی‌کند.
برای بررسی، در نسخه آزمایشی یا به‌صورت موقت و کنترل‌شده، فقط حضور این متغیر بی‌خطر را در گزارش خصوصی برنامه ثبت کنید:
کد / دستورconsole.log("APP_REGION present:", Boolean(process.env.APP_REGION));
اگر خروجی true است، برنامه مقدار غیرخالی دریافت کرده است. false هم نبود متغیر و هم رشته خالی را شامل می‌شود؛ اگر لازم است آن دو را تشخیص دهید، به جای چاپ مقدار محرمانه بررسی کنید که process.env.APP_REGION === undefined هست یا نه. پس از پایان آزمایش، کد موقت را حذف و دوباره برنامه را راه‌اندازی کنید. گزارش باید خصوصی باشد و یک مسیر عمومی برای نمایش متغیرها نسازید.

۴. مقدار واقعی را با نام و قالب درست وارد کنید

حال کلید واقعی را دقیقاً همان‌گونه که در کد نوشته شده وارد کنید و مقدار را از منبع امن خود بردارید. اگر پنل دو کادر جدا برای نام و مقدار دارد، نام را در کادر کلید و مقدار را در کادر مقدار قرار دهید؛ در این حالت معمولاً نباید دور مقدار علامت نقل‌قول اضافی بگذارید، مگر راهنمای همان پنل صریحاً چنین بخواهد. فاصله اضافی در نام یا مقدار می‌تواند اتصال را خراب کند.
پس از ذخیره و Restart، همان قابلیت واقعی، مانند اتصال آزمایشی به پایگاه داده با حساب کم‌دسترسی، را امتحان کنید. اگر مقدار وجود دارد ولی اتصال شکست می‌خورد، نام میزبان، دسترسی حساب، مجوز شبکه و پیام دقیق سرویس مقصد را جدا بررسی کنید. مخفی نگه‌داشتن مقدار به معنی نادیده گرفتن علت خطا نیست.
مقدارهایی مثل "false" در جاوااسکریپت متن غیرخالی‌اند و در یک شرط ساده ممکن است درست تلقی شوند. برای یک گزینه مشخص، تبدیل صریح و اعتبارسنجی بنویسید:
کد / دستورconst featureEnabled = process.env.FEATURE_ENABLED === "true";
این مثال فقط متن دقیق true را فعال می‌کند. فرمت قابل قبول را متناسب با نیاز برنامه مشخص و پیش از انتشار آزمایش کنید.

۵. اگر برنامه از فایل .env استفاده می‌کند

فایل .env معمولاً با ابزارهایی مانند dotenv خوانده می‌شود؛ Node.js در همه نسخه‌ها و همه روش‌های اجرا آن را خودکار برای برنامه بارگذاری نمی‌کند. اگر پروژه شما به dotenv وابسته است، مطمئن شوید بسته در وابستگی‌های لازم برای اجرای برنامه ثبت و در محیط برنامه نصب شده و بارگذاری پیش از استفاده از متغیرها انجام می‌شود. نمونه CommonJS:
کد / دستورrequire("dotenv").config();
این خط را باید مطابق ساختار و روش اجرای خود پروژه، پیش از خواندن متغیرها، قرار داد. در پروژه‌های ES modules شکل import فرق می‌کند. مسیر پیش‌فرض فایل و پوشه کاری پردازش هم اهمیت دارند؛ فایل ممکن است در جایی باشد که برنامه دنبال آن نمی‌گردد. برای یک تنظیم محرمانه، بخش متغیرهای امن پنل معمولاً از قرار دادن فایل داخل پوشه قابل دانلود بهتر است. فایل .env را در مخزن عمومی یا مسیر قابل دسترس وب قرار ندهید و سطح دسترسی‌اش را متناسب با حساب برنامه محدود کنید.

اگر هنوز undefined است

نام کلید، برنامه انتخاب‌شده در پنل، ذخیره تنظیم و Restart را دوباره با هم بررسی کنید. اگر مقدار آزمایشی به برنامه می‌رسد ولی مقدار واقعی نه، تفاوت نام و محل تعریف را پیدا کنید. اگر در ترمینال مقدار دیده می‌شود ولی در برنامه وب نه، آن دو محیط را یکی فرض نکنید. همچنین بعضی ابزارهای ساخت، برخی مقادیر را هنگام build در فایل خروجی قرار می‌دهند؛ تغییر متغیر زمان اجرا الزاماً خروجی ساخته‌شده را عوض نمی‌کند. از گذاشتن کلید محرمانه در کدی که به مرورگر فرستاده می‌شود خودداری کنید.
پس از اصلاح، قابلیت واقعی و گزارش جدید را بررسی و مقادیر آزمایشی را حذف کنید. برای آشنایی با سرویس، صفحه هاست Node.js نت‌آرام و راهنمای انتخاب منابع برای برنامه Node.js را ببینید. توضیح رسمی رفتار متغیرها در مستندات محیط Node.js آمده است.
اشتراک‌گذاری:
لینکدینتلگرامایکس

دیدگاه‌ها (۰)

دیدگاه‌های تاییدشده و پاسخ‌های تیم نت‌آرام