如何修复 'Class extends value undefined is not a constructor or null' NodeJS

How to fix 'Class extends value undefined is not a constructor or null' NodeJS

我有 3 个文件结构,顺序如下,所有文件都包含 1 个 class

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

我已经查看了这些答案,但我的问题似乎与以下人员描述的完全不同。

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 中初始化主 class,因为这会导致以下错误:

module.exports = class Events extends Base {
                                      ^

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

我是否以某种循环方式要求 classes?我不确定我在这里遗漏了什么。

您可能通过在 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 的导入模块上寻找 属性,但没有这样的 属性。您将 class 作为整个模块导出。因此,这就是您需要分配给变量 Base(整个模块)的内容:

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

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

当我将 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;
};

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

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

import { BaseSchema } from '.';

@ObjectType
export class SomeSchema extends BaseSchema { 
}

这应该是可行的,因为文件夹中有一个 index.ts 文件。但是,由于某种原因,它触发了上述错误。我设法通过简单地将导入语句修改为特定路径来修复它。

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

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

总结:

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