13 Followers
·
Follow

Jan 28th, 2016

TL;DR — If you just installed a new version of Node, check your NPM version. If you’re using NPM v3.3.12 (the default for Node 5.5.0), you could run into issues when installing dependencies in your Sails app. Fortunately, NPM fixed this pretty fast, so all you should have to do is upgrade to the latest version of NPM (npm install -g npm@latest) and everything will be hunky dory.

Version 3.0 of NPM (the Node Package Monger) significantly changed the way dependencies are saved in Node apps. Previously, your project’s node_modules/ folder contained a deeply nested tree of subfolders, each representing a dependency of your project. Each one of thosenode_modules/ folders contains more dependencies, each containing their own node_modules/ folder to house their dependencies, and so on.

mySweetApp
├─┬ node_modules
│ ├─┬ packageA@1.0.3 (top level dep)
│ │ ├── node_modules
│ │ │ ├── packageC@2.3.4 (2nd level dep)
│ ├─┬ packageB@0.4.5 (top level dep)
│ │ ├── node_modules
│ │ │ ├── packageC@2.3.4 (2nd level dep)
etc...

This allowed for some optimizations to be made when you ran npm install (a second-level dependency wouldn’t be installed if it matched an existing top-level dependency). But there were still a lot of redundant packages in the tree.

So NPM made some big changes. Beginning with version 3.0, all dependencies are now saved in the top-level node_modules/ folder, unless multiple versions of the same dependency are needed:

mySweetApp
├─┬ node_modules
│ ├── packageA@1.0.3
│ ├── packageB@0.4.5
│ ├── packageC@2.3.4
etc...

This has the potential for a great reduction in redundancy. If your app requires both packageA and packageB, and both of those require compatible versions of packageC, it will only be installed once (at the top level) instead of twice (in the node_modules/ folders of both packageA and packageB).

The NPM 3 paradigm shift has caused a few compatibility issues over time, but in the long run it was the right decision, since it reduces the amount of redundant data you need to download and store on your laptop or server when you run npm install. To make an omelette, you have to crack some eggs. Sometimes, those eggs have little red specks in them, but that’s OK.

Image for post
Image for post

Jan 28th, 2016

A bug was introduced in version 3.3.10 that under some circumstances causes NPM to incorrectly remove a dependency from the top-level node_modules/ folder and place it further down in the tree, breaking any code that require()s that module at the top level. The bug was patched in version 3.4.1, and using that upgrade, installs work as expected.

But be aware: at the time of writing this, the latest stable release of Node (5.5.0) comes bundled with NPM version 3.3.12, which still has the bug. To check the version of NPM you have installed, run:

npm -v

If you’re using NPM v3.3.12, then you should upgrade to the patched release. To do so:

npm install -g npm@latest

Lean back, cross your legs, and enjoy the install.

Sincerely,

The Sails.js Team

P.S. After upgrading, you should be able to npm install in your app without further incident. But if you still see issues, it’s probably time to pull out all the stops:

  1. First, adjust your body into a crouching position and hold on to your desk with one hand.
  2. With the other hand, carefully peck out npm install --force on your keyboard.
  3. Press <enter>, then watch the screen nervously. Try not to lose your balance. Hopefully, in a few seconds, all will be well. But if not, unleash the nuclear option with npm cache clear and then try force installing again.
  4. If that doesn’t work, step away for a second. Listen to some TLC and pour yourself some sparkling grape juice. When you feel ready, continue to the next step. Only you will know when you’re ready.
  5. With your mind refreshed, poke around a bit in the console output from NPM and see if anything jumps out. If you’re at a loss, head over to GitHub and open an issue in the Sails repo. One of us will help you out ASAP.

We make Sails work and things work with Sails.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store