others-How to solve `Cannot find module` error when using npm/express and morgan?
1. Purpose
In this post , I would demonstrate how to solve the following error when using express and morgan with node.js:
internal/modules/cjs/loader.js:638
throw err;
^
Error: Cannot find module 'morgan'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (/opt/node_services/hello_world/app.js:3:16)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
The core error is:
Error: Cannot find module 'morgan'
But I did add the module morgan
in my node.js project as follows:
npm install morgan -g
Why did not that work for me?
2. The solution
2.1 The code
Here is the code that caused the problem:
const express=require("express");
const process=require("process");
const morgan = require('morgan')
const app=express();
app.use(morgan('combined'));
var appname = "default";
var port = 8080;
app.listen(port,()=>{
console.log('listening to port '+port+' on '+appname);
});
app.get('/hello/:name',(req,res)=>{
var name = req.params.name;
res.send("hello "+name+" from "+appname);
});
And I have installed the morgan as follows:
npm install morgan -g
But when I run the following command:
node app.js
I got this error:
internal/modules/cjs/loader.js:638
throw err;
^
Error: Cannot find module 'morgan'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (/opt/node_services/hello_world/app.js:3:16)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
2.2 The solution
TL;DR, here is the solution :
✘ ⚡ npm install --save morgan
+ [email protected]
added 5 packages from 3 contributors in 188.488s
2 packages are looking for funding
run `npm fund` for details
Now run the app again:
✘ ⚡ node app.js server4 8084
appport= 8084
listening to port 8084 on server4
It’s working!
2.3 Why did this solution work?
The key difference is the --save
option in the npm install
command, what does it do?
npm install without specifying a package name will install the dependencies in your package. json . npm install --save will install the package and update your package.
For details, here is the official option list about save
:
npm install
saves any specified packages intodependencies
by default. Additionally, you can control where and how they get saved with some additional flags:
-P, --save-prod
: Package will appear in yourdependencies
. This is the default unless-D
or-O
are present.
-D, --save-dev
: Package will appear in yourdevDependencies
.
-O, --save-optional
: Package will appear in youroptionalDependencies
.
--no-save
: Prevents saving todependencies
.When using any of the above options to save dependencies to your package.json, there are two additional, optional flags:
-E, --save-exact
: Saved dependencies will be configured with an exact version rather than using npm’s default semver range operator.
-B, --save-bundle
: Saved dependencies will also be added to yourbundleDependencies
list.
3. Summary
In this post, I demonstrated how to solve the Error: Cannot find module 'morgan'
error when using express/morgan with node.js, the key point is to call --save
when using npm install
. That’s it, thanks for your reading.