Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ReferenceError : window is not defined at object. <anonymous> Node.js

Tags:

I've seen similar questions that were asked here but none matches my situation. In my web I have 3 JavaScript files : client.js , server.js ,myModule.js . In client.js I create a window variable called windowVar and I add to it some atrributes. In myModule.js ,I add some other attributes and use them there and I export the file and require it in 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'); 

when running the server in node.js I get the following error:

ReferenceError : window is not defined at object. <anonymous>

As I understood window is a browser property ,but how can I solve the error in this case? Any help is appreciated

like image 458
user8244016 Avatar asked Aug 30 '17 15:08

user8244016


2 Answers

window is a browser thing that doesn't exist on Node.js, but ES2020 introduced globalThis, which (being part of the JavaScript specification) is available on both compliant browser engines and in Node.js.

If you really want to create a global in Node.js, use globalThis or (for older versions) global:

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

global is Node's identifier for the global object (defined in their API before globalThis existed), like window is on browsers. For code that may run in a wide range of environments, including older ones:

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

But, there's no need to create truly global variables in Node programs. Instead, just create a module global:

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

...and since you include it in your exports, other modules can access the object it refers to as necessary.

like image 59
T.J. Crowder Avatar answered Sep 29 '22 09:09

T.J. Crowder


I used something like this and it protects against the error:

let foo = null; if (typeof window !== "undefined") {   foo = window.localStorage.getItem("foo"); } 
like image 21
CommonSenseCode Avatar answered Sep 29 '22 09:09

CommonSenseCode