Skip to content

Commit a02e3e2

Browse files
committedFeb 15, 2019
lib: improve error message for MODULE_NOT_FOUND
Include the require stack in the reported error message. PR-URL: #25690 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 05cd1a0 commit a02e3e2

8 files changed

+28
-20
lines changed
 

‎lib/internal/modules/cjs/loader.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,12 @@ Module._resolveFilename = function(request, parent, isMain, options) {
612612
cursor = cursor.parent) {
613613
requireStack.push(cursor.filename || cursor.id);
614614
}
615+
let message = `Cannot find module '${request}'`;
616+
if (requireStack.length > 0) {
617+
message = message + '\nRequire stack:\n- ' + requireStack.join('\n- ');
618+
}
615619
// eslint-disable-next-line no-restricted-syntax
616-
var err = new Error(`Cannot find module '${request}'`);
620+
var err = new Error(message);
617621
err.code = 'MODULE_NOT_FOUND';
618622
err.requireStack = requireStack;
619623
throw err;

‎test/fixtures/require-resolve.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ assert.strictEqual(
1515
// Verify that existing paths are removed.
1616
assert.throws(() => {
1717
require.resolve('bar', { paths: [] })
18-
}, /^Error: Cannot find module 'bar'$/);
18+
}, /^Error: Cannot find module 'bar'/);
1919

2020
// Verify that resolution path can be overwritten.
2121
{
2222
// three.js cannot be loaded from this file by default.
2323
assert.throws(() => {
2424
require.resolve('three')
25-
}, /^Error: Cannot find module 'three'$/);
25+
}, /^Error: Cannot find module 'three'/);
2626

2727
// If the nested-index directory is provided as a resolve path, 'three'
2828
// cannot be found because nested-index is used as a starting point and not
2929
// a searched directory.
3030
assert.throws(() => {
3131
require.resolve('three', { paths: [nestedIndex] })
32-
}, /^Error: Cannot find module 'three'$/);
32+
}, /^Error: Cannot find module 'three'/);
3333

3434
// Resolution from nested index directory also checks node_modules.
3535
assert.strictEqual(

‎test/parallel/test-internal-modules.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const assert = require('assert');
55

66
assert.throws(function() {
77
require('internal/freelist');
8-
}, /^Error: Cannot find module 'internal\/freelist'$/);
8+
}, /^Error: Cannot find module 'internal\/freelist'/);
99

1010
assert.strictEqual(
1111
require(fixtures.path('internal-modules')),

‎test/parallel/test-loaders-hidden-from-users.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ common.expectsError(
99
require('internal/bootstrap/loaders');
1010
}, {
1111
code: 'MODULE_NOT_FOUND',
12-
message: 'Cannot find module \'internal/bootstrap/loaders\''
12+
message: /Cannot find module 'internal\/bootstrap\/loaders'/
1313
}
1414
);
1515

@@ -20,6 +20,6 @@ common.expectsError(
2020
require('owo');
2121
}, {
2222
code: 'MODULE_NOT_FOUND',
23-
message: 'Cannot find module \'owo\''
23+
message: /Cannot find module 'owo'/
2424
}
2525
);

‎test/parallel/test-module-loading-error.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,10 @@ common.expectsError(
8080
message: 'The argument \'id\' must be a non-empty string. Received \'\''
8181
});
8282

83-
common.expectsError(
83+
assert.throws(
8484
() => { require('../fixtures/packages/is-dir'); },
8585
{
8686
code: 'MODULE_NOT_FOUND',
87-
message: 'Cannot find module \'../fixtures/packages/is-dir\''
88-
});
87+
message: /Cannot find module '\.\.\/fixtures\/packages\/is-dir'/
88+
}
89+
);

‎test/parallel/test-module-multi-extensions.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fs.writeFileSync(dotfileWithExtension, 'console.log(__filename);', 'utf8');
3535
require(modulePath);
3636
assert.throws(
3737
() => require(`${modulePath}.foo`),
38-
new Error(`Cannot find module '${modulePath}.foo'`)
38+
(err) => err.message.startsWith(`Cannot find module '${modulePath}.foo'`)
3939
);
4040
require(`${modulePath}.foo.bar`);
4141
delete require.cache[file];
@@ -47,7 +47,7 @@ fs.writeFileSync(dotfileWithExtension, 'console.log(__filename);', 'utf8');
4747
const modulePath = path.join(tmpdir.path, 'test-extensions');
4848
assert.throws(
4949
() => require(modulePath),
50-
new Error(`Cannot find module '${modulePath}'`)
50+
(err) => err.message.startsWith(`Cannot find module '${modulePath}'`)
5151
);
5252
delete require.cache[file];
5353
Module._pathCache = Object.create(null);
@@ -69,7 +69,7 @@ fs.writeFileSync(dotfileWithExtension, 'console.log(__filename);', 'utf8');
6969
const modulePath = path.join(tmpdir.path, 'test-extensions.foo');
7070
assert.throws(
7171
() => require(modulePath),
72-
new Error(`Cannot find module '${modulePath}'`)
72+
(err) => err.message.startsWith(`Cannot find module '${modulePath}'`)
7373
);
7474
delete require.extensions['.foo.bar'];
7575
Module._pathCache = Object.create(null);

‎test/parallel/test-repl.js

+2
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,8 @@ const errorTests = [
534534
expect: [
535535
'Thrown:',
536536
/^{ Error: Cannot find module 'internal\/repl'/,
537+
/^Require stack:/,
538+
/^- <repl>/,
537539
/^ at .*/,
538540
/^ at .*/,
539541
/^ at .*/,

‎test/sequential/test-module-loading.js

+8-7
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ require('../fixtures/node_modules/foo');
131131
assert.ok(my_path.path_func instanceof Function);
132132
// this one does not exist and should throw
133133
assert.throws(function() { require('./utils'); },
134-
/^Error: Cannot find module '\.\/utils'$/);
134+
/^Error: Cannot find module '\.\/utils'/);
135135
}
136136

137137
let errorThrown = false;
@@ -170,12 +170,13 @@ assert.strictEqual(require('../fixtures/registerExt2').custom, 'passed');
170170
assert.strictEqual(require('../fixtures/foo').foo, 'ok');
171171

172172
// Should not attempt to load a directory
173-
try {
174-
tmpdir.refresh();
175-
require(tmpdir.path);
176-
} catch (err) {
177-
assert.strictEqual(err.message, `Cannot find module '${tmpdir.path}'`);
178-
}
173+
assert.throws(
174+
() => {
175+
tmpdir.refresh();
176+
require(tmpdir.path);
177+
},
178+
(err) => err.message.startsWith(`Cannot find module '${tmpdir.path}`)
179+
);
179180

180181
{
181182
// Check load order is as expected

0 commit comments

Comments
 (0)
Please sign in to comment.