getting filehandler is not a constructor when using new filehandler but does not work as static class

32 views Asked by At

getting filehandler is not a constructor when using new filehandler but does not work as static class

USAGE:

demos.filehandler.mjs file:

import { default as filehandler } from "../index.js";

const FileHandler = filehandler.FileHandlerStatic;

const fs = new FileHandler();

// does not work 

(async () => {
  let tst = await fs.readFileStreaming("./demos/profile.jpeg", "binary");
  tst = tst;
  console.log("read: \n\n", tst);
  let written = await fs.writeFileStreaming("./demos/profile.jpeg", tst, "binary");
  console.log("written: ", written);
})();

// does not work

(async () => {
  let tst = await FileHandler.readFileStreaming("./demos/profile.jpeg", "binary");
  tst = tst;
  console.log("read: \n\n", tst);
  let written = await FileHandler.writeFileStreaming("./demos/profile.jpeg", tst, "binary");
  console.log("written: ", written);
})();

for following implementation of demos.filehandler.mjs i am getting the error await FileHandlerStatic.readFileStreaming the last error.


import * as pkg from "../index.js";
const { FileHandlerStatic, default as filehandler } = pkg;

// import * as pkg from "../index.js";
// const FileHandlerStatic = pkg.FileHandlerStatic;


// const FileHandler = filehandler.FileHandlerStatic;

// does not work 

(async () => {
  let tst = await FileHandlerStatic.readFileStreaming("./demos/profile.jpeg", "binary");
  tst = tst;
  console.log("read: \n\n", tst);
  let written = await FileHandlerStatic.writeFileStreaming("./demos/profile.jpeg", tst, "binary");
  console.log("written: ", written);
})();

index.fs file converted to index.js using npx tsc compile using target es5:

while the following demos.filehandler.js file implementation works:


const filehandler = require("../index").default;

const FileHandler = filehandler.FileHandlerStatic;

const fs = new FileHandler();
(async () => {
  let tst = await fs.readFileStreaming("./demos/profile.jpeg", "binary");
  console.log("read: \n\n", tst);
  let written = await fs.writeFileStreaming("./demos/profile.jpeg", tst, "binary");
  console.log("written: ", written);
})();


export class FileHandlerStatic {

  readFileStreaming(filePath: string | URL, options?: BufferEncoding | any | undefined): Promise<any> {
    return new Promise((resolve, reject) => {
      let readStream = fs.createReadStream(filePath, options || {});
      let chunks: any[] = [];
      // readerStream.setEncoding(encoding || { encoding: 'UTF8' });
      readStream.on('error', (err: any) => { reject(err); });
      readStream.on('data', (chunk: any) => { chunks.push(chunk); });
      readStream.on('end', () => {
        Buffer.isBuffer(chunks[0]) ? resolve(Buffer.concat(chunks)) : resolve(chunks.join(""));
      });
    });
  }

  writeFileStreaming(filePath: string | URL, iterableData: any[], options?: BufferEncoding | any | undefined): Promise<any> {
    return new Promise(async (resolve, reject) => {
      try {
        const finished = util.promisify(stream.finished); // (A)
        const writable = fs.createWriteStream(filePath, options || "utf8");
        for await (const chunk of iterableData) {
          // Handle backpressure
          if (!writable.write(chunk)) { await once(writable, 'drain'); }
        }
        writable.end();
        await finished(writable);
        resolve(true);
      } catch (e) {
        reject(e);
      }
    });
  }
}

getting error

file:///C:/Users/ganes/OneDrive/Documents/projects/filehandler/demos/demos.filehandler.jpeg.static.mjs.mjs:23
const fs = new FileHandler();
           ^

TypeError: FileHandler is not a constructor
    at file:///C:/Users/ganes/OneDrive/Documents/projects/filehandler/demos/demos.filehandler.jpeg.static.mjs.mjs:23:12
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:120:12)

Node.js v21.6.1

for 2nd implementation of demos.filehandler.mjs the FileHandlerStatic.readFileStreaming error is as below:

file:///C:/Users/ganes/OneDrive/Documents/projects/filehandler/demos/demos.filehandler.jpeg.static.mjs.mjs:26
  let tst = await FileHandlerStatic.readFileStreaming("./demos/profile.jpeg", "binary");
                                    ^

TypeError: Cannot read properties of undefined (reading 'readFileStreaming')
    at file:///C:/Users/ganes/OneDrive/Documents/projects/filehandler/demos/demos.filehandler.jpeg.static.mjs.mjs:26:37
    at file:///C:/Users/ganes/OneDrive/Documents/projects/filehandler/demos/demos.filehandler.jpeg.static.mjs.mjs:31:3
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:120:12)

Node.js v21.6.1
1

There are 1 answers

5
zouabi On

Should be either:

import * as filehandler from "../index.js";

const FileHandler = filehandler.FileHandlerStatic;

Or

import { FileHandlerStatic as FileHandler } from "../index.js";

Because you are not exporting a default.