【问题标题】:ReferenceError : window is not defined at object. <anonymous> Node.jsReferenceError:窗口未在对象中定义。 <匿名> Node.js
【发布时间】:2017-08-30 15:19:10
【问题描述】:

我在这里看到过类似的问题,但没有一个符合我的情况。在我的网络中,我有 3 个 JavaScript 文件:client.jsserver.jsmyModule.js。在client.js 中,我创建了一个名为windowVar 的窗口变量,并向其中添加了一些属性。在myModule.js 中,我添加了一些其他属性并在那里使用它们,我导出文件并在server.js 中使用它。

client.js:

window.windowVar= {
    func1: function(args) {    
       //some sode here
    },
    counter:0
};

myModule.js

module.exports={wVar:windowVar, addMessage ,getMessages, deleteMessage};

windowVar.serverCounter = 0;
windowVar.arr1=[];

server.js:

var m= require('./myModule');

在 node.js 中运行服务器时出现以下错误:

ReferenceError : 窗口未在对象中定义。 &lt;anonymous&gt;

据我所知 window 是一个浏览器属性,但是在这种情况下我该如何解决这个错误呢?任何帮助表示赞赏

【问题讨论】:

  • 嗯,那个文件似乎是在服务器上运行的,而不是在浏览器上运行的,而且服务器上没有window? Node 确实有一个global 对象,但你为什么要使用它。
  • NodeJS 没有window 对象。所以你需要创建一个window = window || {}
  • @evolutionxbox 我应该在哪里创建它?
  • @user8244016 为什么需要它?
  • @T.J.Crowder 对不起,但我不明白?

标签: javascript node.js


【解决方案1】:

window 是 Node.js 上不存在的浏览器,但 ES2020 引入了 globalThis,它(作为 JavaScript 规范的一部分)在兼容的浏览器引擎和 Node.js 中都可用。

如果你真的想在 Node.js 中创建 全局,请使用 globalThis 或(对于旧版本)global

// BUT PLEASE DON'T DO THIS, keep reading
globalThis.windowVar = /*...*/:
// or
global.windowVar = /*...*/; 

global 是 Node 的全局对象标识符(在 globalThis 存在之前在其 API 中定义),就像 window 在浏览器上一样。对于可能在各种环境中运行的代码,包括较旧的环境:

const g = typeof globalThis === "object"
    ? globalThis
    : typeof window === "object"
        ? window
        : typeof global === "object"
            ? global
            : null; // Causes an error on the next line
g.windowVar = /*...*/;

但是,没有必要在 Node 程序中创建真正的全局变量。相反,只需创建一个全局模块:

let /*or `const`*/ windowVar = /*...*/;

...由于您将其包含在您的exports 中,因此其他模块可以根据需要访问它所引用的对象。

【讨论】:

  • 嗨,谢谢你再帮我一次..问题是我只能使用一个全局变量
  • @user8244016:上面只有一个全局变量。但我无法想象你为什么需要 any 全局变量。
  • 这是我项目中的要求。我在窗口之前尝试了您的解决方案,但是当在模块中添加属性并尝试使用它们时,它出现了另一个问题,似乎是全局变量忘记在模块中添加到它的属性
  • @user8244016: “这是我项目中的要求” 我非常怀疑;如果是的话,那么这一定是针对一堂课的,而且它不会凭空出现。查看您的课堂笔记等。无论如何,如果您确实执行了上述操作,它将创建一个全局。很明显,如果它正在消失,那么您没有执行上述操作。我建议调试以找出问题所在。
  • node.js 中有 window 的原因是为了模拟期望在浏览器中运行的脚本。
【解决方案2】:

我使用了这样的东西,它可以防止错误:

let foo = null;
if (typeof window !== "undefined") {
  foo = window.localStorage.getItem("foo");
}

【讨论】:

    【解决方案3】:

    window 对象仅存在于浏览器的上下文中。在 nodejs 上运行应用程序时,没有可用的 window 对象。如果您想跨多个文件共享变量或函数,则必须使用 requireexports

    client.js

    module.exports = {
        fun1: function(){
    
        },
        counter: 0 
    }
    

    类似在 myModule.js 中的东西

    var client = require('./client');
    

    【讨论】:

      【解决方案4】:

      对于 node.js,主窗口对象称为 gloabal。像这样使用它:

      const example = {
        some: 'Some',
        another: 'Another',
        theOne: function() {
        
          console.log(this.setTimeOut)
          }.bind(global)
       }

      【讨论】:

        【解决方案5】:

        有时,当您使用自定义项目时,根本不需要“窗口”对象,只需在所有其他内容之前用空白定义它:

        window = {};
        

        【讨论】:

          猜你喜欢
          • 2021-02-02
          • 2021-03-30
          • 2020-10-08
          • 2018-05-27
          • 2020-09-18
          • 2020-11-12
          • 2018-10-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多