Đọc một tệp trong Node.js


186

Tôi khá bối rối với việc đọc các tệp trong Node.js.

fs.open('./start.html', 'r', function(err, fileToRead){
    if (!err){
        fs.readFile(fileToRead, {encoding: 'utf-8'}, function(err,data){
            if (!err){
            console.log('received data: ' + data);
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write(data);
            response.end();
            }else{
                console.log(err);
            }
        });
    }else{
        console.log(err);
    }
});

Tệp start.htmlnằm trong cùng thư mục với tệp cố mở và đọc tệp.

Tuy nhiên, trong bảng điều khiển tôi nhận được:

{[Lỗi: ENOENT, mở './start.html'] errno: 34, mã: 'ENOENT', đường dẫn: './start.html'}

Có ý kiến ​​gì không?


8
Rất có thể là tệp không phải là nơi bạn / mã nghĩ rằng nó là. Nếu tệp nằm trong cùng thư mục với tập lệnh, hãy thử:path.join(__dirname, 'start.html')
dc5

1
Bạn có thể console.log ("__ dirname:" + __dirname); ngay trước khi bạn xuất sai? Điều đó sẽ cho biết thư mục nào là cục bộ để bạn thực thi tại thời điểm đó. Có những điều bạn có thể làm để thay đổi vị trí của mình và có thể bạn đang nhấn vào đó, có thể mã không hoạt động tại __dirname nơi bạn nghĩ là như vậy.
Brian

Tệp cần phải nằm trong cùng thư mục mà bạn chạy quy trình nút từ đó. Vì vậy, nếu tệp nằm trong dir / node / index.html và tệp app.js của bạn cũng vậy nhưng bạn thực hiện: node /dir/node/app.js Sau đó, bạn sẽ gặp lỗi. Giải pháp của dc5 nên thực hiện các mẹo.
Evan Shortiss

Bạn nên đóng câu hỏi này hoặc cung cấp bản chỉnh sửa của bạn dưới dạng câu trả lời và chấp nhận nó.
ChrisCM

sử dụng path.join(__dirname, '/filename.html')và tham khảo từ stackoverflow.com/a/56110874/4701635
Paresh Barad

Câu trả lời:


237

Sử dụng path.join(__dirname, '/start.html');

var fs = require('fs'),
    path = require('path'),    
    filePath = path.join(__dirname, 'start.html');

fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
    if (!err) {
        console.log('received data: ' + data);
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write(data);
        response.end();
    } else {
        console.log(err);
    }
});

Cảm ơn dc5.


14
@AramKocharyan Không bao giờ sử dụng * Chức năng đồng bộ hóa trong mã async. Điều này sẽ khóa toàn bộ ứng dụng cho đến khi tập tin được đọc. * Các chức năng đồng bộ hóa được thiết kế để sử dụng khi khởi động ứng dụng, ví dụ như trong hệ thống mô-đun.
Eugene Kostrikov

3
Vâng trong trường hợp của tôi đó là một nhiệm vụ nặng nề.
Aram Kocharyan

2
Có một lỗi đánh máy trong mẫu mã của bạn, bạn path.joinvô dụng, hãy sử dụng ,thay vì+
Yves M.

mã này dường như không hoạt động với tôi, tôi vẫn gặp lỗi tương tự
Aiden87

Tại sao nó không hoạt động khi chỉ sử dụng một đường dẫn đơn giản, như thế ../someFolder/myFile.txtnào?
Miguel Péres

42

Với Node 0.12, giờ đây bạn có thể thực hiện việc này một cách đồng bộ:

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../public/mydata.png');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fslà hệ thống tập tin. readFileSync () trả về Bộ đệm hoặc chuỗi nếu bạn yêu cầu.

fsgiả định chính xác các đường dẫn tương đối là một vấn đề bảo mật. pathlà một công việc xung quanh.

Để tải dưới dạng chuỗi, chỉ định mã hóa:

return fs.readFileSync(path,{ encoding: 'utf8' });

5
Không sử dụng bất kỳ *Syncphương pháp nào khi lập trình cho web. Chúng chỉ thích hợp cho các tác vụ grunt / gulp, ứng dụng bảng điều khiển, v.v. Chúng tạm dừng toàn bộ quá trình trong khi đọc. Tham chiếu mã của OP responseđể rõ ràng đây là một ứng dụng web readFileSynckhông phù hợp.
Samuel Neff

3
Bất kể có hay không có các trường hợp sử dụng khác (và tải tệp vào bộ đệm khi khởi động chắc chắn không phải là một trong số chúng), bài đăng của OP chắc chắn không phải là trường hợp bạn muốn sử dụng readFileSync- trong khi xử lý một yêu cầu web. Câu trả lời này hoàn toàn không phù hợp với câu hỏi trong tầm tay.
Samuel Neff

28

1). Đồng bộ hóa:

var fs = require('fs');
fs.readFile(process.cwd()+"\\text.txt", function(err,data)
            {
                if(err)
                    console.log(err)
                else
                    console.log(data.toString());
            });

2) .Đồng bộ hóa:

var fs = require('fs');
var path = process.cwd();
var buffer = fs.readFileSync(path + "\\text.txt");
console.log(buffer.toString());

3
thay vì process.cwd () tôi nghĩ bạn có thể sử dụng biến __dirname
Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()là thư mục làm việc hiện tại và __dirnamelà thư mục của mô-đun hiện tại nên chúng không giống nhau.
A1rPun

13

cách đồng bộ đơn giản với nút:

let fs = require('fs')

let filename = "your-file.something"

let content = fs.readFileSync(process.cwd() + "/" + filename).toString()

console.log(content)

9

Chạy mã này, nó sẽ lấy dữ liệu từ tệp và hiển thị trong bảng điều khiển

function fileread(filename)
{            
   var contents= fs.readFileSync(filename);
   return contents;
}        
var fs =require("fs");  // file system        
var data= fileread("abc.txt");
//module.exports.say =say;
//data.say();
console.log(data.toString());

5

Để đọc tệp html từ máy chủ bằng httpmô-đun. Đây là một cách để đọc tệp từ máy chủ. Nếu bạn muốn lấy nó trên bàn điều khiển, chỉ cần xóa httpkhai báo mô-đun.

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
  fs.readFile('HTMLPage1.html', function(err, data) {
    if (!err) {
      res.writeHead(200, {
        'Content-Type': 'text/html'
      });
      res.write(data);
      res.end();
    } else {
      console.log('error');
    }
  });
});
server.listen(8000, function(req, res) {
  console.log('server listening to localhost 8000');
});
<html>

<body>
  <h1>My Header</h1>
  <p>My paragraph.</p>
</body>

</html>


Đoạn mã trên là để đọc tệp html trên máy chủ. Bạn có thể đọc tệp html trên máy chủ, bằng cách tạo máy chủ bằng mô-đun "http". Đây là cách để trả lời tập tin trên máy chủ. Bạn cũng có thể xóa mô-đun "http" để tải nó trên bảng điều khiển
Aaditya

1
Xin chào, bạn có thể muốn đưa bình luận của mình vào câu trả lời bằng cách nhấp vào nút chỉnh sửa.
Glenn Watson

3

Nếu bạn muốn biết cách đọc một tập tin, trong một thư mục và làm một cái gì đó với nó, ở đây bạn đi. Điều này cũng cho bạn thấy làm thế nào để chạy một lệnh thông qua power shell. Đây là trong TypeScript! Tôi đã gặp rắc rối với điều này, vì vậy tôi hy vọng điều này sẽ giúp ai đó một ngày nào đó. Hãy bỏ phiếu cho tôi nếu bạn nghĩ rằng điều đó không có ích. Điều này đã làm cho tôi là webpacktất cả các .tstệp của tôi trong mỗi thư mục của tôi trong một thư mục nhất định để sẵn sàng triển khai. Hy vọng bạn có thể đưa nó vào sử dụng!

import * as fs from 'fs';
let path = require('path');
let pathDir = '/path/to/myFolder';
const execSync = require('child_process').execSync;

let readInsideSrc = (error: any, files: any, fromPath: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach((file: any, index: any) => {
        if (file.endsWith('.ts')) {
            //set the path and read the webpack.config.js file as text, replace path
            let config = fs.readFileSync('myFile.js', 'utf8');
            let fileName = file.replace('.ts', '');
            let replacedConfig = config.replace(/__placeholder/g, fileName);

            //write the changes to the file
            fs.writeFileSync('myFile.js', replacedConfig);

            //run the commands wanted
            const output = execSync('npm run scriptName', { encoding: 'utf-8' });
            console.log('OUTPUT:\n', output);

            //rewrite the original file back
            fs.writeFileSync('myFile.js', config);
        }
    });
};

// loop through all files in 'path'
let passToTest = (error: any, files: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach(function (file: any, index: any) {
        let fromPath = path.join(pathDir, file);
        fs.stat(fromPath, function (error2: any, stat: any) {
            if (error2) {
                console.error('Error stating file.', error2);
                return;
            }

            if (stat.isDirectory()) {
                fs.readdir(fromPath, (error3: any, files1: any) => {
                    readInsideSrc(error3, files1, fromPath);
                });
            } else if (stat.isFile()) {
                //do nothing yet
            }

        });
    });
};

//run the bootstrap
fs.readdir(pathDir, passToTest);

2
var fs = require('fs');
var path = require('path');

exports.testDir = path.dirname(__filename);
exports.fixturesDir = path.join(exports.testDir, 'fixtures');
exports.libDir = path.join(exports.testDir, '../lib');
exports.tmpDir = path.join(exports.testDir, 'tmp');
exports.PORT = +process.env.NODE_COMMON_PORT || 12346;

// Read File
fs.readFile(exports.tmpDir+'/start.html', 'utf-8', function(err, content) {
  if (err) {
    got_error = true;
  } else {
    console.log('cat returned some content: ' + content);
    console.log('this shouldn\'t happen as the file doesn\'t exist...');
    //assert.equal(true, false);
  }
});
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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.