NODE 8.0.0和NPM 4.2.0 ERROR快速加载require.extensions.hasOwnProperty不是函数

Mar*_*zes 9 node.js npm

我正在Node 8.0.0和NPM 5.0.0中创建一个应用程序,当我使用快速加载时,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)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!!!!

Lou*_*uis 18

迄今为止发布的答案都没有解释为什么会出现问题以及如何解决问题.

Scoop

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

像测试一样

if (require.extensions.hasOwnProperty(ext) {
Run Code Online (Sandbox Code Playgroud)

由于require.extensions初始化方式,无法在Node 8及更高版本中工作Object.create(null).(详情如下.)

上面的代码必须成为:

if (Object.prototype.hasOwnProperty.call(require.extensions, ext)) {
Run Code Online (Sandbox Code Playgroud)

您仍然必须使用hasOwnProperty与节点6的兼容性.一旦删除与6的兼容性,它可以减少到if (ext in require.extensions) {因为自己和继承属性之间的区别对于创建的对象没有意义Object.create(null).

如果错误的代码是您自己的,只需进行更改.

如果故障代码不是您自己的,那么升级您正在使用的软件包可能会解决问题,如果开发人员已经解决了问题.如果问题在最新版本的软件包中仍然存在,那么您需要提交一份解决问题的问题报告,以便维护人员修复他们的代码.

额外细节

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

版本6:require.extensions从中获取价值Module._extensions.(这里.)并Module._extensions初始化如下:

Module._extensions = {};
Run Code Online (Sandbox Code Playgroud)

版本8:require.extensions获取的价值来自Module._extensions.(这里.)并Module._extensions初始化 如下:

Module._extensions = Object.create(null);
Run Code Online (Sandbox Code Playgroud)

现在运行以下代码:

// This is fine.
console.log({}.hasOwnProperty("foo"));

// This will fail.
console.log(Object.create(null).hasOwnProperty("foo"));
Run Code Online (Sandbox Code Playgroud)

使用Object.create(null)没有hasOwnProperty方法创建的对象.事实上,新创建的对象Object.create(null)没有任何属性,因为它不会从任何东西继承.这是此类对象的吸引力,因为您不必担心自己的属性和继承的属性."toString" in {}是真的,因为它是继承Object而是"toString" in Object.create(null)假的.

如果要hasOwnProperty在其上使用,最有可能与可能初始化您无法控制的对象的旧版本兼容,则必须从Object类中获取该方法:

const obj = Object.create(null);
console.log(Object.prototype.hasOwnProperty.call(obj, "foo"));
Run Code Online (Sandbox Code Playgroud)


abo*_*ron 15

我有这个错误require-dir@0.3.1.升级到0.3.2解决了我的问题.


Dim*_*tri 10

删除node_module/项目的文件夹,然后重新创建npm install.这个对我有用.

  • 那个,我的朋友没有运气 (5认同)

spa*_*row 6

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

require.extensions自节点v0.10.6以来已弃用,并且升级到节点8(完全取消对它的支持)会导致该错误.