NODE 8.0.0和NPM 4.2.0错误express-load require.extensions.hasOwnProperty不是函数

我在节点8.0.0和NPM 5.0.0中创build一个应用程序,当我使用快速加载var load = require("express-load"); 我的服务器返回:

 load/lib/express-load.js:32 if (require.extensions.hasOwnProperty(ext) && extlist.indexOf(ext) === -1) { ^ TypeError: require.extensions.hasOwnProperty is not a function at Object.<anonymous> (/Users/node_modules/express-load/lib/express-load.js:32:26) at Module._compile (module.js:569:30) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:503:32) at tryModuleLoad (module.js:466:12) at Function.Module._load (module.js:458:3) at Module.require (module.js:513:17) at require (internal/module.js:11:18) at Object.<anonymous> (/Users/node_modules/express-load/index.js:8:18) at Module._compile (module.js:569:30) 

我试着降级到npm sudo npm install -g npm@4.2.0版本4.2.0( https://github.com/tjunnone/npm-check-updates/issues/355 )并且不起作用

这篇文章npm检查更新对我有用 。

谢谢!!!!

删除您的项目的node_module/文件夹,并再次进行npm install 。 这个对我有用。

require-dir@0.3.1发生此错误。 升级到0.3.2解决了我的问题。

迄今没有发布的答案解释了为什么会发生这个问题,以及如何解决这个问题。

独家新闻

在节点6中, require.extensions{}初始化。 在节点8中,它使用Object.create(null)初始化。

像一个testing

 if (require.extensions.hasOwnProperty(ext) { 

由于require.extensions使用Object.create(null)初始化,因此无法在节点8和更高版本中工作。 (详情如下。)

上面的代码必须变成:

 if (Object.prototype.hasOwnProperty.call(require.extensions, ext)) { 

为了与节点6兼容,你仍然必须使用hasOwnProperty 。一旦与6的兼容性被删除,它可以被简化为if (ext in require.extensions) {因为对于由Object.create(null)创build的对象,自己的和inheritance的属性之间的区别是没有意义的Object.create(null)

如果错误的代码是你自己的,只要做出改变。

如果错误的代码不是你自己的 ,那么升级你正在使用的软件包可能会解决这个问题,如果开发者已经解决了这个问题。 如果问题仍然存在于最新版本的软件包中,那么您需要input问题报告来解释问题,以便维护人员修复他们的代码。

额外细节

从版本6到版本8的变化是require.extensions的创build方式。

版本6require.extensionsModule._extensions获取它的值。 ( Here 。)和Module._extensions被初始化如下 :

 Module._extensions = {}; 

版本8require.extensions获取来自Module._extensions值。 ( Here 。)和Module._extensions被初始化如下 :

 Module._extensions = Object.create(null); 

现在运行下面的代码:

 // This is fine. console.log({}.hasOwnProperty("foo")); // This will fail. console.log(Object.create(null).hasOwnProperty("foo")); 

Object.create(null)创build的对象没有hasOwnProperty方法。 实际上,用Object.create(null)新创build的对象没有任何属性定义,因为它不会inheritance任何东西。 这是这样的对象的吸引力,因为那么你不必担心自己的属性和遗传属性。 "toString" in {}为true,因为它是从Objectinheritance的,而"toString" in Object.create(null)是false。

如果你想在它上面使用hasOwnProperty ,最有可能与旧版本的兼容性,可能会初始化一个你不能控制的对象,你必须从Object类获取方法:

 const obj = Object.create(null); console.log(Object.prototype.hasOwnProperty.call(obj, "foo")); 

这不是一个npm问题,严格来说是一个node.js问题。

require.extensions已经被弃用,因为节点v0.10.6和升级到节点8,完全放弃对它的支持,导致错误。