【问题标题】:How to fix 'Class extends value undefined is not a constructor or null' NodeJS如何修复'类扩展值未定义不是构造函数或空'NodeJS
【发布时间】:2019-08-08 09:20:13
【问题描述】:

我有 3 个按以下顺序排列的文件结构,它们都包含 1 个类

main.js extends events
events.js extends base
base.js

我已经查看了这些答案,但我的问题似乎与以下人员描述的任何内容不同。 TypeError: Class extends value undefined is not a function or null

main.js

const { Events } = require('./events.js');

module.exports = class Main extends Events {
    constructor(token) {
        super();

        // Some code
    }
}

events.js

const { Base } = require('./base.js');

module.exports = class Events extends Base {
    constructor() {
        super();
    }

    // more code
}

base.js

module.exports = class Base{
    constructor() {
        // Code
    }
}

我无法初始化 index.js 中的主类,因为这会导致以下错误:

module.exports = class Events extends Base {
                                      ^

TypeError: Class extends value undefined is not a constructor or null

我是否以某种方式要求以循环方式上课?我不确定我在这里缺少什么。

【问题讨论】:

    标签: node.js class extends


    【解决方案1】:

    错误消息中报告的文件引用、行号和列号证明是准确且有用的。

    在我的例子中,我扩展了一个从'.' 导入的类。 所以,它看起来像:

    import { BaseSchema } from '.';
    
    @ObjectType
    export class SomeSchema extends BaseSchema { 
    }
    

    这应该可以工作,因为文件夹中有一个index.ts 文件。但是,由于某种原因,它触发了上述错误。我设法修复它,只需将导入语句修改为特定路径。

    import { BaseSchema } from './Base.schema';
    

    我一直使用来自 '.' 的导入和 index.ts 文件。所以,我确实相信在这种特定情况下存在某种循环依赖问题。

    总结:

    • 仔细查看错误消息。它可能指向extends ...
    • 接下来,查找该扩展类的导入语句。
    • 尝试更改该导入语句的路径。这可能会解决它。

    【讨论】:

      【解决方案2】:

      通过在 index.js 中导入外部模块的方式,您可能正在创建某种循环依赖循环。

      但是,似乎大多数情况下你只需要改变这个:

      const { Base } = require('./base.js');
      

      到这里:

      const Base = require('./base.js');
      

      由此而来:

      const { Events } = require('./events.js');
      

      到这里:

      const Events = require('./events.js');
      

      当你做这样的事情时:

      const { Base } = require('./base.js');
      

      它正在查找名为Base 的导入模块上的属性,但没有这样的属性。您将类作为整个模块导出。所以,这就是你需要分配给你的变量Base(整个模块):

      const Base = require('./base.js');
      

      而且 index.js 中导入 main.js 的代码如果还没有正确完成,也必须正确完成。

      【讨论】:

      • 感谢您抽出宝贵时间回答,答案看起来很简单,但真的很有帮助,因为我完全没有注意到我导出内容的方式的不同。
      【解决方案3】:

      当我将 Squelize ORM 与 NodeJS 一起使用时,我收到一个错误,即“Sequelize TypeError: Class extends value undefined is not a constructor or null, NodeJS”。我试图解决这个问题,并找到了一些解决方案。对于一些试图解决此错误的人来说,有一个解决方案。

      我得到了这个错误并用它解决了它。如果您有同样的错误,您可以使用我尝试在代码中解释它的以下解决方案。希望对你有帮助!

      module.exports = (sequelize, DataTypes) => {
      
          // Modeling a table: Inheritance
          class Todo extends sequelize.Model {} // (!) Error
      
          // if you want to use the above line, add the following line to "lib\sequelize.js file
          // Sequelize.prototype.Model = Model; // add this line here
      
          class Example extends sequelize.Sequelize.Model { }
      
          Example.init({
              title: DataTypes.STRING,
              description: DataTypes.STRING,
              status: DataTypes.BOOLEAN
          }, {
              sequelize,
              modelName: 'todo',
              timestamps: true
          });
      
          return Example;
      };
      

      【讨论】:

        猜你喜欢
        • 2019-02-16
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        • 2021-10-16
        • 2022-01-22
        • 2021-05-23
        • 1970-01-01
        • 2021-04-15
        相关资源
        最近更新 更多