module: prevent race condition while combining import and require

This checks if any require calls have happened to the same file
during the file read. If that was the case, it'll return the same
module instead of creating a new instance.

PR-URL: https://github.com/nodejs/node/pull/27674
Reviewed-By: Guy Bedford <guybedford@gmail.com>
This commit is contained in:
Ruben Bridgewater 2019-05-13 14:19:28 +02:00
parent 52255868c5
commit 9939762322
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762

View File

@ -123,6 +123,16 @@ translators.set('json', async function jsonStrategy(url) {
});
}
const content = await readFileAsync(pathname, 'utf-8');
// A require call could have been called on the same file during loading and
// that resolves synchronously. To make sure we always return the identical
// export, we have to check again if the module already exists or not.
module = CJSModule._cache[modulePath];
if (module && module.loaded) {
const exports = module.exports;
return createDynamicModule(['default'], url, (reflect) => {
reflect.exports.default.set(exports);
});
}
try {
const exports = JsonParse(stripBOM(content));
module = {