【问题标题】:Why is a function provided by require undefined in a class instance? [duplicate]为什么在类实例中需要未定义的函数? [复制]
【发布时间】:2021-09-30 16:54:52
【问题描述】:

我问这个主要是为了进行健全性检查,我不确定我是否在某个地方犯了错误,或者这根本不起作用。

我正在将一些 Java 转换为 Nodejs,一个名为 Site 的类通过 dataFunctions.getSiteInfo(id) 函数从数据库中填充自身。它还存储一个 Page 实例列表。

问题是创建 Site 实例时 dataFunctions 返回未定义。

我是否误解了在这种情况下类和模块的工作方式?此类的实例是否可以访问 dataFunctions 模块?同样,Site 类是否也可以引用 Page 类?还是我犯了其他一些愚蠢的错误?

网站.js

let Page = require('./Page.js');
let dataFunctions = require('../DataFunctions.js');

module.exports = class Site {
    constructor(id) {
        this.id = id;
        this.pages = [];

        console.log(dataFunctions);
        this.siteInfo = dataFunctions.getSiteInfo(id);

DataFunctions.js

let Site = require('./classes/Site.js');

function makeASite() {
    let id = 2;
    let site = new Site(id);
}

function getSiteInfo(id) {
    etc etc
}

module.exports = {
    getSiteInfo: function (id) {
        return getSiteInfo(id);
    },
};

【问题讨论】:

  • 请发布您的项目结构
  • 你有一个循环的 require 循环。不能那样做。 Site.js 需要 DataFunctions.js,而 DataFunctions.js 需要 Site.js。这里通常的解决方案是将两个模块想要使用的公共代码分解为第三个模块,每个模块都可以包含而不是相互包含。
  • module.exports.getSiteInfo = getSiteInfoit will work替换那个导出

标签: javascript node.js javascript-objects node-modules


【解决方案1】:

根据提供的代码,我相信你忘了创建一个新的dataFunctions 实例。

const df = new dataFunctions();
console.log(df);

如果dataFunctions 提供静态函数,请确保getSiteInfo 方法是静态的。

否则,可能需要其他详细信息。

编辑

项目结构和require 路径看起来很奇怪,但很难说。

当我使用require 语句推断的项目结构运行提供的代码时,我无法重现您的问题。

但是,我确实看到的一个问题是,您需要 DataFunctions.js 模块中的 Site.js 模块和 Site.js 模块中的 DataFunctions.js 模块,从而创建循环依赖关系。例如,通过将makeASite 移动到Site.js 模块来尝试eliminating

【讨论】:

  • 等等,我认为 JS 中的类只是花哨的 JS 对象。 JS中通常不需要创建函数的实例。
  • dataFunctions 类是如何声明的?我刚刚测试了静态与实例化,当我声明 static getSiteInfo 时它运行良好,但给了我一个错误,即 getSiteInfo 不是没有静态声明的函数。如果你得到一个未定义的,这可能是一个完全不同的错误。
  • 我更新了帖子,提供了更多关于此的信息,dataFunctions 不是一个类,它是一个模块,抱歉应该更清楚。
  • @Nonnisi js 中的类只是函数。 JS 中的对象是对象。与 Java 的不同之处在于您不能在 Java 中创建对象字面量(尽管您可以创建字符串字面量,例如:"hello"、数字字面量等)。尽管 Java 也有类似的东西:匿名类。
  • @phentnil 我同意您对循环循环的评论,问题是 dataFunctions 实际上是一个 mySQL 连接器并管理连接,因此任何进行数据库调用的东西都需要引用它。 (由于需要添加 JS 回调和承诺,数据库问题仍然一团糟)。我开始认为这段代码无法转换,我可能需要完全重新考虑项目结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多