Błąd JS węzła: ENOENT

87

Śledzę razem z: The Node Beginner Book

Po przetestowaniu z kodem z innego postu SO:

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);
    }
}

Błąd nadal występuje:

Błąd: ENOENT, brak takiego pliku lub katalogu „tmp”

struktura katalogu aplikacji

Uprawnienia do tmp to 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);

Trochę zaskoczony, każda pomoc doceniona.

Wasabi
źródło
1
Jaki jest Twój process.cwd()?
wyzwolony
3
znalazłem rozwiązanie tutaj: stackoverflow.com/questions/7681407/… . Uwielbiam to forum!
Wasabi

Odpowiedzi:

90

"/tmp/test.jpg"nie jest poprawną ścieżką - ta ścieżka zaczyna się od tego, /który jest katalogiem głównym.

W systemie UNIX skrót do bieżącego katalogu to .

Spróbuj tego "./tmp/test.jpg"

ihciad
źródło
5
Wyjaśnia to dokładnie dobrze. /tmpróżni się od ./tmp. /tmpnie znajduje się w bieżącym katalogu, znajduje się w katalogu głównym.
3ocen,
18

Aby wyjaśnić, dlaczego wystąpił błąd: Ukośnik na początku ścieżki oznacza „zacznij od katalogu głównego systemu plików i poszukaj podanej ścieżki”. Brak ukośnika oznacza „zacznij od bieżącego katalogu roboczego i poszukaj podanej ścieżki”.

Ścieżka

/tmp/test.jpg

w ten sposób oznacza szukanie pliku test.jpg w folderze tmp w katalogu głównym systemu plików (np. c: \ w systemie Windows, / on * nix), zamiast w folderze webapp . Dodanie kropki (.) Przed ścieżką jawnie zmienia to na „rozpocznij od bieżącego katalogu roboczego”, ale jest zasadniczo tym samym, co całkowite pozostawienie ukośnika.

./tmp/test.jpg = tmp/test.jpg
Jens Wegar
źródło
8

jeśli twój folder tmp jest względny w stosunku do katalogu, w którym działa twój kod, usuń /przed /tmp.

Więc po prostu masz tmp/test.jpgw swoim kodzie. U mnie to zadziałało w podobnej sytuacji.

Dave Howell
źródło
0

Możesz dołączyć inny plik jade do swojego szablonu, pochodzący z innego katalogu

views/
     layout.jade
static/
     page.jade

Aby dołączyć plik układu z katalogu views dir do static / page.jade

page.jade

extends ../views/layout
Bastin Robin
źródło
0

zmiana

"/tmp/test.jpg".

do

"./tmp/test.jpg"
Adeojo Emmanuel IMM
źródło
-6

użyj „temp” zamiast „tmp”

„/temp/test.png”

zadziałało dla mnie po tym, jak zdałem sobie sprawę, że tmp jest folderem tymczasowym, którego nie było na moim komputerze, ale mój temp był moim folderem tymczasowym

///

EDYTOWAĆ:

Utworzyłem również nowy folder „tmp” na moim dysku C: i wszystko działało idealnie. Książka mogła nie wspomnieć o tym małym kroku

sprawdź http://webchat.freenode.net/?channels=node.js, aby porozmawiać z niektórymi członkami społeczności node.js

sQuijeW
źródło