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
Advertisement
Answer
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.