Kesalahan Node JS: ENOENT

87

Saya mengikuti bersama: The Node Beginner Book

Setelah menguji dengan kode dari posting SO lain:

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

Kesalahan tetap ada:

Error: ENOENT, tidak ada file atau direktori 'tmp' seperti itu

struktur direktori aplikasi

Izin pada tmp adalah 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);

Sedikit bingung, bantuan apa pun dihargai.

Wasabi
sumber
1
apa yang Anda process.cwd()?
merayakan
3
menemukan solusinya di sini: stackoverflow.com/questions/7681407/… . Suka forum ini!
Wasabi

Jawaban:

90

"/tmp/test.jpg"bukan jalur yang benar - jalur ini dimulai dengan /direktori root.

Di unix, pintasan ke direktori saat ini adalah .

Coba ini "./tmp/test.jpg"

ihciad
sumber
5
Dia menjelaskannya dengan tepat. /tmpberbeda dari ./tmp. /tmptidak ada di direktori saat ini, melainkan di direktori root.
3ocene
18

Untuk menjelaskan sedikit mengapa kesalahan terjadi: Garis miring di awal jalur berarti "mulai dari root sistem file, dan cari jalur yang diberikan". Tidak ada garis miring berarti "mulai dari direktori kerja saat ini, dan cari jalur yang diberikan".

Jalan

/tmp/test.jpg

sehingga diterjemahkan menjadi mencari file test.jpg di folder tmp di root sistem file (misalnya c: \ di windows, / di * nix), bukan di folder webapp . Menambahkan titik (.) Di depan jalur secara eksplisit mengubah ini menjadi "mulai dari direktori kerja saat ini", tetapi pada dasarnya sama dengan meninggalkan garis miring sepenuhnya.

./tmp/test.jpg = tmp/test.jpg
Jens Wegar
sumber
8

jika folder tmp Anda relatif terhadap direktori tempat kode Anda berjalan, hapus /di depan /tmp.

Jadi, Anda hanya tmp/test.jpgmemasukkan kode Anda. Ini berhasil bagi saya dalam situasi yang sama.

Dave Howell
sumber
0

Anda dapat menyertakan file giok yang berbeda ke dalam template Anda, dari direktori yang berbeda

views/
     layout.jade
static/
     page.jade

Untuk memasukkan file layout dari views dir ke static / page.jade

page.jade

extends ../views/layout
Bastin Robin
sumber
0

perubahan

"/tmp/test.jpg".

untuk

"./tmp/test.jpg"
Adeojo Emmanuel IMM
sumber
-7

gunakan "temp" sebagai pengganti "tmp"

"/temp/test.png"

itu berfungsi untuk saya setelah saya menyadari tmp adalah folder sementara yang tidak ada di komputer saya, tetapi temp saya adalah folder sementara saya

///

EDIT:

Saya juga membuat folder baru "tmp" di drive C: saya dan semuanya bekerja dengan sempurna. Buku itu mungkin tidak menyebutkan langkah kecil itu

lihat http://webchat.freenode.net/?channels=node.js untuk mengobrol dengan beberapa komunitas node.js

sQuijeW
sumber