Wasabi
Wasabi

Reputation: 1591

Node JS Error: ENOENT

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.

Upvotes: 89

Views: 341885

Answers (6)

Stratorrider
Stratorrider

Reputation: 26

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

Upvotes: 1

Adeojo Emmanuel IMM
Adeojo Emmanuel IMM

Reputation: 2154

change

"/tmp/test.jpg".

to

"./tmp/test.jpg"

Upvotes: 1

ihciad
ihciad

Reputation: 927

"/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"

Upvotes: 91

Jens Wegar
Jens Wegar

Reputation: 4842

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

Upvotes: 18

Dave Howell
Dave Howell

Reputation: 81

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.

Upvotes: 8

Bastin Robin
Bastin Robin

Reputation: 938

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

Upvotes: 0

Related Questions