大佬教程收集整理的这篇文章主要介绍了当两个文件相互需要时,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,您必须做的“全部”不是在 Player
或 Room
的顶层使用 Player.js
或 Room.js
,而是使用您正在使用的 CJS 模块还必须做更多的事情。我不是在 CJS 模块中整理循环的专家,但我认为您需要做的主要事情不是尝试立即获取 Player
或 Room
导出。让模块先完成加载。例如:
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,导入的绑定是有效的。因此,虽然您仍然必须避免在 Player
和 Room
的顶层使用 Room.js
和 Player.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,请注明来意。