2015-03-29 18 views
5

Đây là mã của tôi:Node.js tập tin ghi trong vòng lặp không ngẫu nhiên

function aCallbackInLoop(dataArray) { 
     dataArray.forEach(function (item, index) { 

      fs.appendFile(fileName, JSON.stringify(item) + "\r\n", function (err) { 
       if (err) { 
        console.log('Error writing data ' + err); 
       } else { 
        console.log('Data written'); 
       } 
      }); 
     }); 
    } 

tôi nhận được lỗi ngẫu nhiên:

Data written 
Data written 
. 
. 
Error writing data Error: UNKNOWN, open 'output/mydata.json' 
Error writing data Error: UNKNOWN, open 'output/mydata.json' 
. 
. 
Data written 
Error writing data Error: UNKNOWN, open 'output/mydata.json' 

Chức năng (aCallbackInLoop) là một callback cho một yêu cầu dịch vụ web , trả về các khối dữ liệu trong dataArray. Nhiều yêu cầu dịch vụ web đang được thực hiện trong một vòng lặp, do đó, cuộc gọi lại này có lẽ được gọi song song. Tôi nghi ngờ đó là một số vấn đề khóa tập tin, nhưng tôi không chắc chắn làm thế nào để giải quyết.

PS: Tôi đã thực hiện chắc chắn nó không phải là một vấn đề dữ liệu (Tôi đăng nhập tất cả các mục trong dataArray)

Chỉnh sửa: Mã sau khi cố gắng ghi dòng:

function writeDataToFile(fileName, data) { 
    try { 
     var wStream = fs.createWriteStream(fileName); 
     wStream.write(JSON.stringify(data) + "\r\n"); 
     wStream.end(); 
    } catch (err) { 
     console.log(err.message); 
    } 
} 

function aCallbackInLoop(dataArray){ 
    dataArray.forEach(function(item, index){ 
     writeDataToFile(filename, item); //filename is global var 
    }); 
} 

Trả lời

2

Hãy thử sử dụng phiên bản đồng bộ appendFile - https://nodejs.org/api/fs.html#fs_fs_appendfilesync_filename_data_options

+0

Điều này giải quyết vấn đề này, nhưng tôi vẫn hy vọng để có được cách làm việc không đồng bộ. Nếu không, tôi sẽ đánh dấu câu trả lời này là giải pháp. – SlowAndSteady

+1

Sử dụng một phiên bản đồng bộ hiếm khi đi đúng cách trong máy chủ node.js. – jfriend00

+0

@ jfriend00 - Đúng, nhưng với bối cảnh đã viết cho cùng một tệp một lần nữa và một lần nữa, đồng bộ là cách tiếp cận tốt nhất. OP có thể phải thiết kế lại. – manojlds

6

Như bạn đã quan sát thấy, nhiều cuộc gọi appendFile không thể tiếp tục do các cuộc gọi trước đây appendFile. Trong trường hợp cụ thể này, sẽ tốt hơn nếu tạo một write stream.

var wstream = fs.createWriteStream(fileName); 

dataArray.forEach(function (item) { 
    wstream.write(JSON.stringify(item + "\r\n"); 
}); 

wstream.end(); 

Nếu bạn muốn biết khi nào tất cả các dữ liệu được ghi, sau đó bạn có thể đăng ký một chức năng với sự kiện finish, như thế này

var wstream = fs.createWriteStream(fileName); 

wstream.on("finish", function() { 
    // Writing to the file is actually complete. 
}); 

dataArray.forEach(function (item) { 
    wstream.write(JSON.stringify(item + "\r\n"); 
}); 

wstream.end(); 
+0

Tôi thấy đây là cách đi đúng, nhưng tôi vẫn gặp lỗi. Nếu tôi sử dụng appendFileSync - thì mọi thứ đều hoạt động. Nhưng tôi không muốn sử dụng phiên bản đồng bộ. Vẫn tự hỏi tôi đang làm gì sai! – SlowAndSteady

+0

@SlowAndSteady Bạn có thể hiển thị mã thực tế mà bạn đã thử không? – thefourtheye

+0

@SlowAndSteady Tại sao bạn tạo luồng cho mọi dữ liệu? Thay đổi nó tốt hơn như cách tôi đã hiển thị (chỉ tạo luồng một lần) và thử. – thefourtheye

Các vấn đề liên quan