اگر شما تجربه کار بر روی پروژههای nodejs رو داشته باشید و با کتابخانهها nodejs و جاوااسکریپت و فریمورک هایی مثل vue , angular و react کار کرده باشید حتما با خطا “Error: cannot find module” مواجه شدید و این پیام را در هنگام دباگ پروژه nodejs خود مشاهده کردید.
در این آموزش دلیل نمایش این خطا و همینطور راه حل رفع این خطا را با هم مرور خواهیم کرد تا با استفاده از این مطالب این خطا را در پروژههای nodejs خود رفع کنیم.
مشاهده خطای پروژه در ترمینال با استفاده از pm2
برای وارد شدن در محیط ترمینال، در سیپنل لاگین میکنیم (آموزش لاگین به سیپنل) و به تب advance میرویم و روی گزینه terminal کلیک میکنیم.
با کلیک بر روی گزینه terminal وارد ترمینال میشویم و میتوانیم دستورات nodejs را وارد و اجرا کنیم.
برای مشاهده و بررسی خطا لاگ وارد محیط ترمینال شده و دستور pm2 logs به همراه نام دامنه و یا سابدامنه پروژه را وارد میکنیم و با زدن اینتر، لاگ پروژه و خطاهای احتمالی در صورت بروز،نمایش داده می شود.
دلیل نمایش خطای MODULE_NOT_FOUND
عمدهترین دلایلی که باعث میشود در پروژههای nodejs با این خطا مواجه شویم به شرح زیر است:
1- در پروژه در حال ایمپورت کردن آیتمی هستیم که ماژول آن در فولدر پروژه ما وجود ندارد.
2- اگر پکیجی که در حال استفاده از آن هستیم قدیمی(outdated) باشد و با ورژن nodejs ما همخوانی نداشته باشد با این خطا مواجه میشویم
3- در پروژه فایلی فراخوانی میشود که در پروژه موجود نیست.
اما اکثر این خطا زمانی نمایش داده میشود که ما در پروژه خود از دستوراتی با استفاده از فرمان import در پروژه خود استفاده کردیم اما پکیج آن را هنوز نصب نکردیم.
راه حل رفع خطای MODULE_NOT_FOUND
در واقع، در هنگام دباگ پروژههای nodejs با استفاده از دستور pm2 logs yourdomain.com (به جای yourdomain.com باید نام دامنه و یا سابدامنه ای که در هنگام ایجاد اپلیکیشن تعریف شده است، استفاده کرد.)
متن خطایی که نمایش داده میشود شامل اطلاعات مهمی هست که دلیل خطا و راه حل آن را به ما نمایش میدهد.
البته باید توجه داشته باشید که برای استفاده از دستور pm2 logs، باید حتما اپلیکیشن خود را در قسمت Nodejs Application ایجاد کرده باشید و اگر در قسمت Setup Nodejs App ایجاد شده باشد نمیتوانید pm2 logs استفاده کنید و برای استفاده از این دستور باید پروژه خود را از قسمت Setup Nodejs App حذف و در در قسمت Nodejs Application ایجاد و راهاندازی کنید.
فرمت خطای نمایش داده شده در ترمینال یکسان هست و با این فرمت نمایش داده میشود که کار را برای ما آسان میکند.
“Module not found: Error: Can’t resolve ‘package name‘ in ‘project directory”.
در پیام خطا، نام پکیجی که مربوط به خطا هست را نمایش میدهد و اشاره میکند که فولدر نصب پکیج کجاست.
برای حل این مشکل باید پکیجی که در خطا به آن اشاره شده است را در محیط ترمینال نصب کنیم
npm install package-name
به جای package-name نام پکیجی که در خطا وجود دارد را وارد میکنیم تا پکیج مورد نیاز اپلیکیشن ما نصب شود.
بعد از نصب موفق پکیج، پروژه خود را ریلود میکنیم و در مرورگر اپلیکیشن خود را تست و بررسی میکنیم.
اگر همچنان پروژه شما خطا داشت و با نصب پکیج مورد نیاز، مشکل رفع نشد و پروژه اجرا نشد، در قدم بعدی اقدامات زیر را انجام میدهیم.
1-دستور زیر را در محیط ترمینال اجرا میکنیم:
rm -rf node_modules
با اجرای این دستور، فولدر node_modules را از روی هاست پاک میکنیم. توجه داشته باشید که این دستور فقط و فقط فولدر پکیج های نصب شده روی هاست را حذف میکند و به هیچ عنوان فایل های پروژه شما و یا دیتابیس شما را تحت تاثیر قرار نمیدهد.
2- دستور زیر را وارد و اجرا میکنیم:
rm -f package-lock.json
با این دستور ما این فایل را از روی هاست حذف میکنیم تا در مراحل بعدی فایل جدید package-lock.json
ایجاد شود.
فایل package-lock.json
به صورت خودکار در پروژه ایجاد میشود و هدف آن حفظ سازگاری بین نسخههایی از برنامه هست که در جاهای مختلف نصب خواهند شد. در این فایل ورژن دقیق پکیجهایی که در پروژه استفاده شده است، ذخیره میشود.
وجود فایل package-lock.json هنگام اجرای دستور npm install این اطمینان را میدهد که دقیقاً همان ورژن از پکیجهایی برای ما نصب شوند که انتظار آن را داریم. این کار باعث میشود که پروژه ما در محیطهای مختلف و نسخههای مختلف nodejs، رفتارهای یکسان و قابل پیشبینی داشته باشد.
فایل package-lock.json علاوه بر اینکه ورژن دقیق پکیجها را ذخیره میکند، جزییاتی مثل Dependency های پکیج و آدرس URL که پکیج باید از آن لینک دانلود شود، را هم ذخیره میکند.
با اجرای دستور بالا، این فایل حذف میشود و در مراحل بعدی یک نسخه جدید از آن در پروژه ما ساخته خواهد شد.
3- دستور زیر را بعد از اجرای دستور قبلی اجرا میکنیم:
npm cache clean --force
تمامی دادههای فولدر کش را npm خالی و پاک میشود. طبق مستندات سایت npmjs.com، با اینکه تمامی عملیات لازم در مورد کش (مثلا اعتبارسنجی، تشخیص خطا در پکیجها و پاک کردن کش در صورت لزوم) توسط خود npm انجام میگیرد، معمولاً نیازی به پاک کردن کش npm نیست و تنها دلیل منطقی برای این کار، پاک کردن حافظه است.
به همین دلیل در نسخههای جدیدتر npm، دستور npm cache clean به تنهایی کار نمیکند و در کنار آن حتماً باید گزینه force– را هم بکار برد.
با این وجود وقتی پکیجی را نصب میکنیم که انتظار داریم بدون مشکل کار کند ولی درست کار نمیکند، یکی از راهحلهای احتمالی پاک کردن کش است.
4- و در آخر،دستور زیر را در مسیر پروژه، در ترمینال وارد و اجرا میکنیم تا پکیج ها از نو در مسیر پروژه نصب شود.
npm install
بعد از اینکه تمامی پکیجها به طور کامل نصب شدند، پروژه خود را ریلود میکنیم و با کارهایی که انجام دادیم باید خطای پروژه ما رفع شده باشد و پروژه ما به درستی اجرا شود و خطای دیگری در لاگ نمایش داده نشود.
اگر در زمان نصب یک یا دو پکیج نصب نشد، ورژن نود رو تغییر میدهیم و دوباره یکی از نسخههای nodejs را نصب میکنیم.
چنانچه شما تجربه ای در این زمینه دارید که فکر میکنید سایر کاربران میتوانند از آن استفاده کنند و یا اگر نکته ای ناگفته باقی ماند از بخش نظرات مطرح بفرمایید.
و اگر احیانا خطای پروژه شما رفع نشد میتوانید تیکت بزنید (ارسال تیکت) تا همکاران واحد فنی، پروژه شما را بررسی و راهنمایی های لازم خدمت شما ارائه شود.