89

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.

Wasabi
  • 1,591
  • 1
  • 16
  • 22
  • 1
    what is your `process.cwd()`? – fent Jan 29 '12 at 02:42
  • 3
    found the solution here: http://stackoverflow.com/questions/7681407/node-js-fs-stat-throws-enoent-the-operation-completed-successfully. Love this forum! – Wasabi Feb 01 '12 at 00:37

6 Answers6

91

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

meetar
  • 7,443
  • 8
  • 42
  • 73
ihciad
  • 927
  • 6
  • 3
  • 5
    He explains it exactly right. `/tmp` is different from `./tmp`. `/tmp` is not in the current directory, it's in the root directory. – 3ocene Sep 07 '16 at 22:33
18

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
Jens Wegar
  • 4,147
  • 4
  • 29
  • 34
8

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.

AlvaroAV
  • 10,335
  • 12
  • 60
  • 91
Dave Howell
  • 81
  • 1
  • 2
1

change

"/tmp/test.jpg".

to

"./tmp/test.jpg"
Adeojo Emmanuel IMM
  • 2,104
  • 1
  • 19
  • 28
1

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

0

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
Bastin Robin
  • 907
  • 16
  • 30