From 66601f13d9f841fe4e644a0b106ea3106054f46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Geisendo=CC=88rfer?= Date: Mon, 21 Feb 2011 15:46:34 +0100 Subject: [PATCH] Do not cache modules that throw exceptions If a module throws an exception on load, it should not be cached. This patch shows the problem in a test case and also fixes it. See: https://groups.google.com/forum/#!topic/nodejs-dev/1cIrvJcADbY Closes GH-707 Closes GH-710 --- lib/module.js | 8 +++++++- test/simple/test-require-exceptions.js | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/simple/test-require-exceptions.js diff --git a/lib/module.js b/lib/module.js index ba0b4f355963db..304387d03083f8 100644 --- a/lib/module.js +++ b/lib/module.js @@ -270,7 +270,13 @@ Module._load = function(request, parent, isMain) { } Module._cache[filename] = module; - module.load(filename); + try { + module.load(filename); + } catch (err) { + delete Module._cache[filename]; + throw err; + } + return module.exports; }; diff --git a/test/simple/test-require-exceptions.js b/test/simple/test-require-exceptions.js new file mode 100644 index 00000000000000..6dc12212ae38fc --- /dev/null +++ b/test/simple/test-require-exceptions.js @@ -0,0 +1,12 @@ +var common = require('../common'); +var assert = require('assert'); + +// A module with an error in it should throw +assert.throws(function() { + require(common.fixturesDir + '/throws_error'); +}); + +// Requiring the same module again should throw as well +assert.throws(function() { + require(common.fixturesDir + '/throws_error'); +});