DEV Community

Simone Aronica
Simone Aronica

Posted on • Edited on

ReadFileSync return ENOENT

A bit of backstory

I'm trying to run an https REST server with express and I'm using webpack to compile and bundle.
Now this is my structure:

-dist
-src
 -server
  server.js
 client
  index.html
  index.js
.babelrc
package.json
webpack.config.js
rootCA.key
rootCA.pem

I have imported in server.js rootCA.key and rootCA.pem like this:

7 import key from '../../rootCA.key';
8 import cert from '../../rootCA.pem';

so whenever I build in my dist folder I import those files through file-loader.

Now to the problem

When I run the server and those two lines are executed the result is an ENOENT like this:

fs.js:114
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/406598dc63994ef30b45f867a314da17.key'
    at Object.openSync (fs.js:443:3)
    at Object.readFileSync (fs.js:343:35)
    at eval (webpack:///./src/server/server.js?:19:21)
    at Module../src/server/server.js (C:\Users\simon\Desktop\CodeProjects\dual-setup\dist\server.js:121:1)
    at __webpack_require__ (C:\Users\simon\Desktop\CodeProjects\dual-setup\dist\server.js:20:30)
    at C:\Users\simon\Desktop\CodeProjects\dual-setup\dist\server.js:84:18
    at Object.<anonymous> (C:\Users\simon\Desktop\CodeProjects\dual-setup\dist\server.js:87:10)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)

I don't understand what the problem could be as both server.js and the key are in the dist directory.

Some configurations

webpack.config.js


const path = require('path')
const fs = require('fs');
const nodeExternals = require('webpack-node-externals')
module.exports = {
  entry: {
    server: './src/server/server.js',
  },
  output: {
    path: path.join(__dirname, 'dist'),
    publicPath: '/',
    filename: '[name].js'
  },
  target: 'node',
  node: {
    // Need this when working with express, otherwise the build fails
    __dirname: false,   // if you don't put this is, __dirname
    __filename: false,  // and __filename return blank or /
  },
  externals: [nodeExternals()], // Need this to avoid error when working with Express
  module: {
    rules: [
      {
        // Transpiles ES6-8 into ES5
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.(pem|key)$/,
        use: {
          loader: 'file-loader'
        }
      }
    ]
  },
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    port: 8080,
    https: {
      cert: fs.readFileSync('./rootCA.pem'),
      key: fs.readFileSync('./rootCA.key')
    }
  }
}

It should be noted that the command that I use to run the server is as simple as:

node ./dist/server.js

Top comments (6)

Collapse
 
richardeschloss profile image
Richard Schloss

In the part where you readFileSync, I would use path.resolve. Same for the part with path.join.

contentBase: path.resolve(__dirname, 'dist'),
key: path.resolve(__dirname, 'rootCA.key'),
cert: path.resolve(__dirname, 'rootCA.cert'),

Also, since you're using relative paths, you'd have to change directories to your dist folder to run your server, but it seems like your source code goes up 2 directories, when your dist would only need to go up one (i.e., ../../ should be ../)

If possible, it may be helpful to use aliases to help with path resolution. See more examples here: webpack.js.org/configuration/resolve/

Collapse
 
itssimondev profile image
Simone Aronica

Hello Richard, thanks for the answer!
So yes, I go up twice because webpack bundles starting from the src file, and since server.js is contained into server, which is contained into root where the certificate is I have to go up twice so that webpack can import it into dist. As you can see from the error I get the key that fails to be imported is has a / before the filename, which means that it gets imported correctly into the dist folder. However I will try tomorrow to use path.resolve as (I hope at least) it might help! So thanks for the tip!

Collapse
 
katnel20 profile image
Katie Nelson

Hey Simone. Have you tried running this outside your own Desktop folder? Create a new folder under C:\ and use absolute paths rather than relative ones.

Collapse
 
itssimondev profile image
Simone Aronica

Hey thanks for the reply. I cannot use absolute paths as in this project we'll be many developers... But no, I haven't tried.

Collapse
 
katnel20 profile image
Katie Nelson

Okay, but let us know how it turns out.

Thread Thread
 
itssimondev profile image
Simone Aronica • Edited

I will, but I'm pretty stuck as there's no reason for it to not work. I could understand it if it was something generated by me, but it's something generated by webpack itself. I think we'll probably just stay on HTTP for the development and then upgrade to HTTPS via the Domain Provider.