امروز صبح قصد push کردن آخرین تغییرات به سرور Heroku را داشتم که با خطای زیر رو به رو شدم:
npm http GET https://registry.npmjs.org/mongoose/-/mongoose-3.8.3.tgz
npm http 404 https://registry.npmjs.org/mongoose/-/mongoose-3.8.3.tgz
npm ERR! fetch faild https://registry.npmjs.org/mongoose/-/mongoose-3.8.3.tgz
npm ERR! Error: 404 Not Found
npm ERR! at null.<anonymous> (███\nodejs\node_modules\npm\lib\utils\fetch.js:47:16)
npm ERR! at EventEmitter.emit (events.js:126:20)
npm ERR! at WriteStream.flush (fs.js:1529:12)
npm ERR! at Object.oncomplete (fs.js:297:15)
npm ERR! If you need help, you may report this log at:
npm ERR! <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR! <npm-@googlegroups.com>
البته این تنها قسمتی آغازین پیغام بود و چند صد خط بعد از آن نیز در خروجی چاپ شد که مربوط به مشکلات ناشی از این خطا بودند. این خطا پس از اجرای دستور push به سرور Heroku به عنوان خروجی این دستور از سرور بر می گشت. با وجود بررسی هایی که انجام دادم تغییراتی که در کد ایجاد شده بود هیچ ارتباطی با این خطا نداشت.
خطا وقتی ایجاد می شد که Heroku قصد داشت ماژول mongoose را با دستور npm دریافت کند. هر چند تا دیشب این دریافت با موفقیت انجام می شد، ولی حالا با خطا همراه بود.
پس از کمی بررسی و سر زدن به سایت npmjs.org متوجه شدم که نسخه ای جدید از mongoose یک ساعت قبل منتشر شده است و به نظر می رسید نسخه جدید مشکل را ایجاد کرده است.
به سراغ فایل package.json رفتم و متوجه شدم برای mongoose هیچ نسخه خاصی مشخص نشده و طبعا npm سعی می کند آخرین نسخه را دریافت کند:
"dependencies": {
...
"mongoose": "*",
...
},
شروع به پیدا کردن نسخه سالمی از mongoose کردم. ابتدا دستور
npm install mongoose@3.8.3
با خطای مشابه رو به رو شد ولی دستور
npm install mongoose@3.8.1
به درستی ماژول را دریافت کرد.
با قرار دادن نسخه 3.8.1 ( آخرین نسخه که درست کار میکرد) و push مجدد، مشکل بر طرف شد.
هر چند استفاده از * به جای نسخه مشخص یا محدوده برای نسخه قابل قبول ماژول، بسیار راحت تر است، ولی گاهی هم مشکلاتی را ایجاد می کند که باعث اتلاف وقت بیهوده می شود.