我正在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)并且不起作用
谢谢!!!!
Lou*_*uis 18
迄今为止发布的答案都没有解释为什么会出现问题以及如何解决问题.
在节点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)
| 归档时间: |
|
| 查看次数: |
7221 次 |
| 最近记录: |