Use fs in typescript

node.jsTypescript

node.js Problem Overview


I'm just trying to read a file using fs.readFileSync, though it seems it cannot be found.

I made sure to declare it, added it within my constructor:

export default class Login extends React.Component<LoginProps, {}> {
    private webAuth: auth0.WebAuth;
    fs: any;

    constructor(props: any, context: any) {
        super(props, context);
        this.fs = require('fs');
        this.webAuth = new auth0.WebAuth({
            clientID: conf.auth0.clientId,
            domain: conf.auth0.domain,
            responseType: 'token id_token',
            redirectUri: `${window.location.origin}/login`
        });
    }
[...]

And used it in a simple function:

verifyToken = (token) => {

    console.log(this.fs);
    let contents = this.fs.readFileSync('../utils/public.key', 'utf8');
    console.log(contents);

}

But this raises an Uncaught TypeError: _this.fs.readFileSync is not a function. Is there a special way to include fs in Typescript ?

node.js Solutions


Solution 1 - node.js

I can't imagine any case in which you would use fs inside a React component. Even though you can use React in the server to render stuff, the same code is supposed to run in the client, there's no way you can access fs in the client.

If you want to use fs in the server, this is an example:

import * as fs from 'fs';
import * as path from 'path';
fs.readFile(path.join(__dirname, '../../client/index.html'), 'utf8', (error, data) => {
        // ...
    })

On your package.json file, make sure to have a dependency on node

"dependencies": {
 "@types/node": "^7.0.5"
}

And this is how my tsconfig.json file looks like:

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": true,
        "noImplicitAny": true,
        "module": "commonjs",
        "target": "es5",
        "jsx": "react",
        "allowJs": true,
        "typeRoots": [
            "./node_modules/@types"
        ]
    },
    "include": [
        "./db/**/*",
        "./src/**/*"
    ]
}

Solution 2 - node.js

Using node -v 10.15.0 and @types/node:

It seems declaration has been rewritten...

fs definition is declared as a module so you should do:

import fs from "fs"; // Without star

compiled:

var fs_1 = __importDefault(require("fs"));

or

const fs = require("fs"); instead of require("fs").default;

with star you will have fs.default.TheFunctionYouWant instead of fs.TheFunctionYouWant

The better way is to console.log(fs); to see what it is imported.

{
  "compilerOptions": {
    "typeRoots": [],
    "types": [
      "node"
    ]
  }
}

Solution 3 - node.js

Latest implantation, you can import methods.

import { readFile, writeFile } from 'fs/promises';

And use directly...

// write
await writeFile('./file.json', content);

// read
const content = await readFile('./file.json');

Reference https://nodejs.org/docs/latest-v14.x/api/

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPierre Olivier TranView Question on Stackoverflow
Solution 1 - node.jsAndre PenaView Answer on Stackoverflow
Solution 2 - node.jsShim-SaoView Answer on Stackoverflow
Solution 3 - node.jsRafael PizaoView Answer on Stackoverflow