Lỗi Node JS: ENOENT


87

Tôi đang theo dõi cùng với: Sách dành cho người mới bắt đầu Node

Sau khi thử nghiệm với mã từ một bài đăng SO khác:

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

Lỗi vẫn tiếp diễn:

Lỗi: ENOENT, không có tệp hoặc thư mục nào như vậy 'tmp'

cấu trúc dir ứng dụng

Quyền trên tmp là 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);

Một chút bối rối, bất kỳ sự giúp đỡ nào được đánh giá cao.


1
của bạn là process.cwd()gì
— fent

3
đã tìm thấy giải pháp ở đây: stackoverflow.com/questions/7681407/… . Yêu thích diễn đàn này!
— Wasabi

Câu trả lời:


89

"/tmp/test.jpg"không phải là đường dẫn chính xác - đường dẫn này bắt đầu bằng /thư mục gốc.

Trong unix, lối tắt đến thư mục hiện tại là .

Thử đi "./tmp/test.jpg"


5
Anh ấy giải thích nó hoàn toàn đúng. /tmpkhác với ./tmp. /tmpkhông có trong thư mục hiện tại, nó nằm trong thư mục gốc.
— 3ocene

18

Để mở rộng một chút về lý do tại sao lỗi xảy ra: Dấu gạch chéo về phía trước ở đầu đường dẫn có nghĩa là "bắt đầu từ thư mục gốc của hệ thống tệp và tìm kiếm đường dẫn đã cho". Không có dấu gạch chéo chuyển tiếp có nghĩa là "bắt đầu từ thư mục làm việc hiện tại và tìm đường dẫn đã cho".

Con đường

/tmp/test.jpg

do đó dịch để tìm kiếm các tập tin test.jpg trong thư mục tmp tại thư mục gốc của hệ thống tập tin (ví dụ c: \ trên cửa sổ, / trên * nix), thay vì các ứng dụng web thư mục. Thêm dấu chấm (.) Vào trước đường dẫn thay đổi rõ ràng điều này thành "bắt đầu từ thư mục làm việc hiện tại", nhưng về cơ bản giống như bỏ hoàn toàn dấu gạch chéo.

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

8

nếu thư mục tmp của bạn có liên quan đến thư mục mà mã của bạn đang chạy, hãy xóa phần /trước /tmp.

Vì vậy, bạn chỉ có tmp/test.jpgtrong mã của bạn. Điều này đã làm việc cho tôi trong một tình huống tương tự.


0

Bạn có thể đưa một tệp ngọc bích khác vào mẫu của mình, từ một thư mục khác

views/
     layout.jade
static/
     page.jade

Để bao gồm tệp bố cục từ views dir đến static / page.jade

page.jade

extends ../views/layout


-6

sử dụng "temp" thay cho "tmp"

"/temp/test.png"

nó hoạt động với tôi sau khi tôi nhận ra tmp là một thư mục tạm thời không tồn tại trên máy tính của tôi, nhưng tạm thời của tôi là thư mục tạm thời của tôi

///

BIÊN TẬP:

Tôi cũng đã tạo một thư mục mới "tmp" trong ổ C: của mình và mọi thứ hoạt động hoàn hảo. Cuốn sách có thể đã bỏ sót đề cập đến bước nhỏ đó

xem http://webchat.freenode.net/?channels=node.js để trò chuyện với một số cộng đồng node.js

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.