2013-07-11 104 views
18

Đoạn mã sau xuất ra nội dung của index.html (nó chỉ chứa thế giới hello văn bản) cho trình duyệt. Tuy nhiên, khi tôi thay thế readFile bằng readFileSync, yêu cầu sẽ hết thời gian. Tôi đang thiếu gì? Là một loại khác nhau của bộ đệm cần thiết? Tôi đang sử dụng nút 0,61 và bày tỏ 2,4Sự khác biệt giữa readFile và readFileSync

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

var app = express.createServer(express.logger()); 

app.get('/', function(request, response) { 
    fs.readFile('index.html', function(err, data){ 
     response.send(data.toString()); 
    }); 
}); 

var port = process.env.PORT || 5000; 
app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 
+0

Không phải bạn phải gọi 'END() 'khi bạn hoàn tất việc gửi? Đã lâu rồi kể từ khi tôi sử dụng NodeJS. –

+2

Ý của bạn là gì khi 'khi tôi thay thế readFile bằng readFileSync'? Người đầu tiên yêu cầu gọi lại trong khi người kia thì không. Mã phải là 'var data = fs.readFileSync ('index.html');'. Gọi lại không bao giờ được gọi, bởi vì 'readFileSync' không sử dụng nó. Đó là nơi thời gian chờ xuất phát. Giả sử tôi hiểu nó một cách chính xác. – freakish

+1

@CrazyTrain Anh ấy đang sử dụng Express. Nó làm điều đó cho bạn. – freakish

Trả lời

25

fs.readFile mất một cuộc gọi trở lại trong đó kêu gọi response.send như bạn đã chỉ ra - tốt. Nếu bạn chỉ cần thay thế điều đó bằng fs.readFileSync, bạn cần phải biết rằng nó không lấy lại cuộc gọi để gọi lại của bạn gọi response.send sẽ không bao giờ được gọi và do đó phản hồi sẽ không bao giờ kết thúc và nó sẽ hết thời gian chờ.

Bạn cần hiển thị mã readFileSync nếu bạn không chỉ thay thế readFile bằng readFileSync.

Ngoài ra, chỉ vì vậy bạn biết, bạn nên bao giờ gọi readFileSync trong một nút nhanh/webserver vì nó sẽ buộc lên vòng sợi đơn trong khi I/O được thực hiện. Bạn muốn vòng lặp nút xử lý các yêu cầu khác cho đến khi I/O hoàn tất và mã xử lý cuộc gọi lại của bạn có thể chạy.

+8

Bạn có thể gọi readFileSync để tải chứng chỉ SSL của mình từ đĩa khi máy chủ khởi động, vì bạn cần chặn cho đến khi chúng sẵn sàng. Nhưng, bạn là điểm lớn hơn là hoàn toàn chính xác. – dankohn

+0

@bryanmac cảm ơn, Tôi có thể tìm hiểu thêm về chức năng nào để sử dụng hay không trong ứng dụng nút/express? – Ali

+4

Quy ước là tất cả các API đều không đồng bộ và các ngoại lệ sử dụng định dạng xxxSync. Tránh xxxSync trừ khi bạn ý thức có ý nghĩa là đồng bộ (khởi động hoặc tập lệnh). Máy chủ nên không đồng bộ. – bryanmac

7
'use strict' 
var fs = require("fs"); 

/*** 
* implementation of readFileSync 
*/ 
var data = fs.readFileSync('input.txt'); 
console.log(data.toString()); 
console.log("Program Ended"); 

/*** 
* implementation of readFile 
*/ 
fs.readFile('input.txt', function (err, data) { 
    if (err) return console.error(err); 
    console.log(data.toString()); 
}); 

console.log("Program Ended"); 

Để hiểu rõ hơn chạy đoạn code trên và so sánh kết quả ..

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