I’m looking at some code from a coworker wrote and she’s using the
@ symbol in require statements. This is the first line of one of these files:
var restServer = require('@company/config')
When I try to run this code, I get an error:
Error: Cannot find module '@company/config'
Which I frankly expect, there’s nothing that looks like this in my directory for require to recognize! It seems like there’s some magic going on here, which I hate.
All I can guess is that either this is some obscure npm or Node trick that I haven’t been exposed to, or maybe that there’s some other dark art of configuration that I’m not getting. Any info appreciated, even if it’s just an explanation of how
@ works with require.
Other ideas: Chef is involved somewhere in this whole thing, so that might be relevant.
Update: 99% certain this is an issue with the way
npm config works at this point, but still unsure of how to go about fixing it.
Update2 based on some stuff I uncovered:
Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN Dereks-MacBook-Pro:project-dir derekjanni$ npm install npm ERR! Darwin 15.0.0 npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install" npm ERR! node v5.5.0 npm ERR! npm v3.5.3 npm ERR! code E404 npm ERR! 404 Not found : @company/config npm ERR! 404 '@company/config' is not in the npm registry.
Scoped packages in npm are preceded by an ‘@’ symbol: https://docs.npmjs.com/misc/scope
The docs include additional information on requiring scoped packages:
Requiring scoped packages
Because scoped packages are installed into a scope folder, you have to
include the name of the scope when requiring them in your code, e.g.
There is nothing special about the way Node treats scope folders, this
is just specifying to require the module mypackage in the folder
So I solved this one myself.
@company/config is one of our private NPM repositories, hosted on npm and defined by this alias to an internal GitHub repository: it had nothing to do with how
@ may or may not be a protocol that I was unaware of for private NPM repos, keep that in mind if you run into this.
When you call
require() it reads a route. Since there seems to be no problem if you name a folder as
@company, you should be able to require something with an
Your coworker may have wanted to keep
@company/config.js for herself because configurations usually are personal and could not be the same for another user.
require will call files inside your project folder, with a detail:
- If you call files inside your project folders you must add
./in front of your route.
- If you call any global package such as
npmmodules (which are installed at
node_modules), you can omit the
I created a route
@company/config inside my test project folder. It only allowed me to require it using
./@company/config. Only when i moved the folder inside
node_modules, it allowed me to
I wouldn’t recommend to put any module inside
node_modules, it’s just a ‘container’ for
npm packages. Try to create a new config file and change the require route or simply delete the require and create a config object in your main file.