程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了当两个文件相互需要时,Nodejs“不是构造函数”错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决当两个文件相互需要时,Nodejs“不是构造函数”错误?

开发过程中遇到当两个文件相互需要时,Nodejs“不是构造函数”错误的问题如何解决?下面主要结合日常开发的经验,给出你关于当两个文件相互需要时,Nodejs“不是构造函数”错误的解决方法建议,希望对你解决当两个文件相互需要时,Nodejs“不是构造函数”错误有所启发或帮助;

我需要将两个 Js 对象(Player 和 Room)放入彼此的文件中。但是当我这样做时,发生了意外错误。

app.Js:

const Player = require("./Player").Player

let player = new Player()

Player.Js:

const Room = require ("./Room").Room
let room = new Room()

const Player = function () {
    let room = new Room()
}

exports.Player = Player

Room.Js:

const Player = require("./Player").Player
let player = new Player()

const Room = function () {
    
}

exports.Room = Room

错误:

/home/mosi/Github/test/Room.Js:2
let player = new Player()
             ^

TypeError: Player is not a constructor
    at Object.<anonymous> (/home/mosi/Github/test/Room.Js:2:14)
    at Module._compile (internal/modules/cJs/loader.Js:778:30)
    at Object.Module._extensions..Js (internal/modules/cJs/loader.Js:789:10)
    at Module.load (internal/modules/cJs/loader.Js:653:32)
    at trymoduleLoad (internal/modules/cJs/loader.Js:593:12)
    at Function.Module._load (internal/modules/cJs/loader.Js:585:3)
    at Module.require (internal/modules/cJs/loader.Js:692:17)
    at require (internal/modules/cJs/Helpers.Js:25:18)
    at Object.<anonymous> (/home/mosi/Github/test/Player.Js:1:14)
    at Module._compile (internal/modules/cJs/loader.Js:778:30)

解决方法

因为它们相互依赖,所以你的模块是循环的;请参阅 Node.js 文档 here。正如他们所说,“需要仔细规划以允许循环模块依赖项在应用程序中正常工作。” :-)

如果您可以避免在循环中使用模块,那通常是最好的。

对于 ESM,您必须做的“全部”不是在 PlayerRoom 的顶层使用 Player.jsRoom.js,而是使用您正在使用的 CJS 模块还必须做更多的事情。我不是在 CJS 模块中整理循环的专家,但我认为您需要做的主要事情不是尝试立即获取 PlayerRoom 导出。让模块先完成加载。例如:

app.js

const Player = require("./Player").Player;

let player = new Player();

Player.js

// Import the module exports object,but don't grab its `Room` property yet
const RoomMod = require ("./Room");
// Don't do this at the top level: let room = new Room()

const Player = function () {
    // Now it's safe to use the `Room` property
    let room = new RoomMod.Room();
};

exports.Player = Player;

Room.js

// Get the module exports object,but don't try to get the `Player` property yet
const PlayerMod = require("./Player");
// Don't do this at the top level: let player = new Player()

const Room = function () {
    
};

exports.Room = Room;

就其价值而言,如果您使用 ESM(JavaScript 标准模块),您不必只导入模块然后再使用属性,因为使用 ESM,导入的绑定是有效的。因此,然您仍然必须避免在 PlayerRoom 的顶层使用 Room.jsPlayer.js,但您可以在不需要模块命名空间对象(ESM 等效项)的情况下导入它们CJS 导出对象):

app.js

import { Player } from "./Player.js";

let player = new Player();

Player.js

import { Room } from "./Room.js";

export const Player = function () {
    let room = new Room()
};

Room.js

import { Player } from "./Player.js";

export const Room = function () {
    
};

大佬总结

以上是大佬教程为你收集整理的当两个文件相互需要时,Nodejs“不是构造函数”错误全部内容,希望文章能够帮你解决当两个文件相互需要时,Nodejs“不是构造函数”错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: