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方式。
版本6 : require.extensions
从Module._extensions
获取它的值。 ( Here 。)和Module._extensions
被初始化如下 :
Module._extensions = {};
版本8 : require.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,因为它是从Object
inheritance的,而"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,完全放弃对它的支持,导致错误。