2013-07-15 28 views
15

Điều tôi muốn làm là đọc một tệp và sau đó có thể thực hiện các thao tác khác với thông tin đó khi tôi ghi tệp. Ví dụ:Node.js làm thế nào để đọc một tập tin và sau đó viết cùng một tập tin với hai chức năng riêng biệt?

đọc tập tin ghi tập tin và đồng thời thực hiện MD5 băm, chữ ký điện tử, vv

tôi có thể sử dụng fs.readfile và fs.writefile là một hoạt động và chỉ cần sao chép các tập tin từ trang web máy chủ vào máy tính của tôi, nhưng tôi không nghĩ rằng tôi vẫn có thể thực hiện các hoạt động tương tự này. Dù sao, bỏ qua giữa các công cụ. Làm cách nào để sử dụng fs.readfile và writefile để tạo hai hàm riêng biệt để sao chép một tệp? Dưới đây là những gì tôi đã làm việc trên, và có tôi đã đọc các diễn đàn rộng rãi trong việc tìm kiếm một câu trả lời.

var fs = require('fs'); 



function getData(srcPath) { 
fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     return data; 
     } 
    ); 
} 


function writeData(savPath, srcPath) { 
     fs.writeFile (savPath, (getData(srcPath)), function(err) { 
     if (err) throw err; 
      console.log('complete'); 
     } 
    ); 
} 
//getData ('./test/test.txt'); 
writeData ('./test/test1.txt','./test/test.txt'); 

Tôi muốn có thể tải xuống tệp bất kỳ loại nào và chỉ tạo bản sao thô, với md5 băm, v.v. đính kèm vào tệp JSON. Đó có lẽ sẽ là một câu hỏi cho sau này.

+0

getData không có gì trong mã của bạn. bạn cần phải gọi writeFile trong callback của readFile. nếu bạn muốn git-r-dun, luôn có fs.readFileSync(), hoạt động như bạn có thể mong đợi. – dandavis

Trả lời

17

Như được đề xuất bởi dandavis trong nhận xét của mình, readFile không có gì bởi vì đó là cuộc gọi không đồng bộ. Hãy xem this answer để biết thêm thông tin về điều đó có nghĩa là gì.

Tóm lại, cuộc gọi không đồng bộ sẽ không bao giờ chờ kết quả trả về. Trong ví dụ của bạn, getData không đợi readFile() trả lại kết quả bạn muốn, nhưng sẽ kết thúc ngay lập tức. Cuộc gọi không đồng bộ thường được xử lý bằng cách chuyển số callbacks, là thông số cuối cùng đến readFilewriteFile.

Trong mọi trường hợp, có hai cách để làm điều này:

1.Do nó không đồng bộ (đó là cách thích hợp):

function copyData(savPath, srcPath) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) throw err; 
      //Do your processing, MD5, send a satellite to the moon, etc. 
      fs.writeFile (savPath, data, function(err) { 
       if (err) throw err; 
       console.log('complete'); 
      }); 
     }); 
} 

2.Do nó đồng bộ. Mã của bạn sẽ không phải thay đổi nhiều, bạn chỉ cần thay thế readFilewriteFile theo số readFileSyncwriteFileSync tương ứng. Cảnh báo: sử dụng phương pháp này không chỉ chống lại các phương pháp hay nhất, mà còn bất chấp mục đích sử dụng nodej (trừ khi bạn có lý do chính đáng).

Sửa: Theo yêu cầu của OP của, đây là một cách tốt để tách hai phương pháp, ví dụ, sử dụng callbacks:

function getFileContent(srcPath, callback) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     callback(data); 
     } 
    ); 
} 

function copyFileContent(savPath, srcPath) { 
    getFileContent(srcPath, function(data) { 
     fs.writeFile (savPath, data, function(err) { 
      if (err) throw err; 
      console.log('complete'); 
     }); 
    }); 
} 

Bằng cách này, bạn đang tách phần đọc (trong getFileContent) từ phần bản sao.

+0

Từ những gì bạn nói, nó sẽ là một sự lãng phí thời gian phù hợp để làm điều này một cách đồng bộ. Tôi chỉ nghĩ rằng nó sẽ dễ dàng hơn để cắt bỏ readfile và writeful như các chức năng riêng biệt trong trường hợp tôi sẽ cần phải sử dụng chỉ một và không phải là khác trong chương trình.Tuy nhiên, nếu tôi có thể thực hiện tất cả việc xử lý một cách chính xác, điều này sẽ hoạt động tốt hơn. Tôi sẽ phải thử nó và xem nó có hoạt động không. –

+0

Xem bản chỉnh sửa của tôi để biết cách tách riêng phần đọc khỏi quá trình sao chép. Bạn có thể áp dụng kỹ thuật tương tự cho writeFile (ví dụ: chuyển một cuộc gọi lại). – verybadalloc

0

Tôi đã phải sử dụng tính năng này gần đây, vì vậy tôi đã chuyển đổi câu trả lời verybadallocs thành lời hứa.

function readFile(srcPath) { 
    return new Promise(function (resolve, reject) { 
     fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(data); 
      } 
     }); 
    }) 
} 

function writeFile(savPath, data) { 
    return new Promise(function (resolve, reject) { 
     fs.writeFile(savPath, data, function (err) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(); 
      } 
     }); 
    }) 
} 

Sau đó sử dụng chúng rất đơn giản.

readFile("path").then(function(results){ 
    results+=" test manipulation"; 
    return writeFile("path",results); 
}).then(function(){ 
    //done writing file, can do other things 
}) 
Các vấn đề liên quan