Node JS Error: ENOENT

node.js

node.js Problem Overview


I'm following along with: The Node Beginner Book

After testing with the code from another SO post:

var Fs = require('fs');

var dirs = ['tmp'];
var index;
var stats;

for (index = 0; index < dirs.length; ++index)
{
    try
    {
        stats = Fs.lstatSync(dirs[index]);
        console.log(dirs[index] + ": is a directory? " + stats.isDirectory());
    }
    catch (e)
    {
        console.log(dirs[index] + ": " + e);
    }
}

The error persist:

> Error: ENOENT, no such file or directory 'tmp'

app dir structure

The permissions on tmp are 777.

requestHandlers.js

var querystring = require("querystring"),
    fs = require("fs");

function start(response, postData) {
  console.log("Request handler 'start' was called.");

  var body = '<html>'+
    '<head>'+
    '<meta http-equiv="Content-Type" '+
    'content="text/html; charset=UTF-8" />'+
	'<style>input{display: block; margin: 1em 0;}</style>'+
    '</head>'+
    '<body>'+
    '<form action="/upload" method="post">'+
    '<textarea name="text" rows="20" cols="60"></textarea>'+
    '<input type="submit" value="Submit text" />'+
    '</form>'+
    '</body>'+
    '</html>';

    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();
}

function upload(response, postData) {
  console.log("Request handler 'upload' was called.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("You've sent the text: "+
  querystring.parse(postData).text);
  response.end();
}

function show(response, postData) {
  console.log("Request handler 'show' was called.");
  fs.readFile("/tmp/test.jpg", "binary", function(error, file) {
    if(error) {
      response.writeHead(500, {"Content-Type": "text/plain"});
      response.write(error + "\n");
      response.end();
    } else {
      response.writeHead(200, {"Content-Type": "image/jpg"});
      response.write(file, "binary");
      response.end();
    }
  });
}

exports.start = start;
exports.upload = upload;
exports.show = show;

Index.js

var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");

var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
handle["/show"] = requestHandlers.show;

server.start(router.route, handle);

A little stumped, any help appreciated.

node.js Solutions


Solution 1 - node.js

"/tmp/test.jpg" is not the correct path – this path starts with / which is the root directory.

In unix, the shortcut to the current directory is .

Try this "./tmp/test.jpg"

Solution 2 - node.js

To expand a bit on why the error happened: A forward slash at the beginning of a path means "start from the root of the filesystem, and look for the given path". No forward slash means "start from the current working directory, and look for the given path".

The path

/tmp/test.jpg

thus translates to looking for the file test.jpg in the tmp folder at the root of the filesystem (e.g. c:\ on windows, / on *nix), instead of the webapp folder. Adding a period (.) in front of the path explicitly changes this to read "start from the current working directory", but is basically the same as leaving the forward slash out completely.

./tmp/test.jpg = tmp/test.jpg

Solution 3 - node.js

if your tmp folder is relative to the directory where your code is running remove the / in front of /tmp.

So you just have tmp/test.jpg in your code. This worked for me in a similar situation.

Solution 4 - node.js

You can include a different jade file into your template, that to from a different directory

views/
     layout.jade
static/
     page.jade

To include the layout file from views dir to static/page.jade

page.jade

extends ../views/layout

Solution 5 - node.js

change

"/tmp/test.jpg".

to

"./tmp/test.jpg"

Solution 6 - node.js

Other one that my help is:

const path = require('path');
const filePath = path.join(__dirname, './path/filename.ext');

I had a little problem just using './paths' and the above one solved ENOENT

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
QuestionWasabiView Question on Stackoverflow
Solution 1 - node.jsihciadView Answer on Stackoverflow
Solution 2 - node.jsJens WegarView Answer on Stackoverflow
Solution 3 - node.jsDave HowellView Answer on Stackoverflow
Solution 4 - node.jsBastin RobinView Answer on Stackoverflow
Solution 5 - node.jsAdeojo Emmanuel IMMView Answer on Stackoverflow
Solution 6 - node.jsStratorriderView Answer on Stackoverflow