2013-07-14 26 views
5

Tôi đã tìm kiếm trên web và tài liệu cho các mô-đun node.jsexpress và có vẻ như không có cách nào để gửi dữ liệu theo từng phần. Tôi có một tập tin kết xuất không phải là rất nhanh và tôi muốn gửi một phần của nó trước khi tất cả mọi thứ được trả lại.Gửi dữ liệu theo các phần trong node.js express

Vì vậy, đây là những câu hỏi của tôi:

  1. Có một phương pháp trên response để gửi dữ liệu bằng phần?
  2. response.end() là gì?
  3. Nếu không có cách nào để gửi dữ liệu theo từng phần - lý do cơ bản đằng sau là gì? Tôi sẽ nói rằng nó trông chặn hơn không chặn nếu đó là sự thật. Trình duyệt có thể tải thông tin nhanh hơn nếu dữ liệu được cung cấp trước đó.

mẫu mã đơn giản:

app.get(..) { 
    renderFile(file, function(data) { 
    response.send(data); 
    }); 
    response.end(); 
) 

Đoạn mã này chỉ gửi một đoạn đầu tiên của dữ liệu. Tôi đã kiểm tra - dữ liệu được cung cấp chính xác và gọi lại được gọi nhiều lần.

Tất nhiên tôi có thể nối thêm dữ liệu vào một biến và sau đó viết response.send(data); nhưng tôi không thích cách tiếp cận này - đó không phải là cách nó hoạt động.

Trả lời

9

Đối tượng response là luồng có thể ghi. Chỉ cần viết thư cho nó, và Express thậm chí sẽ thiết lập mã hóa chunked cho bạn tự động.

response.write(chunk); 

Bạn cũng có thể đăng nhập vào nó nếu bất kỳ điều gì tạo "tệp" này tự hiển thị dưới dạng luồng có thể đọc được. http://nodejs.org/api/stream.html

+0

Xin hãy giải thích trên đường ống và đưa ra một thí dụ. Tôi cảm thấy điều này rất phù hợp với rất nhiều người, vì nó thực sự là một giải pháp tốt hơn trong nhiều trường hợp. –

+0

@NielsAbildgaard Tôi không thể đưa ra ví dụ cụ thể vì mã trong câu hỏi không cung cấp bất kỳ ngữ cảnh nào về dữ liệu đến từ đâu. 'sourceStream.pipe (response)' sẽ thực hiện thủ thuật. – Brad

1

Express mở rộng Kết nối mở rộng HTTP mà tôi tin tưởng. Nhìn vào HTTP API, có vẻ như những gì bạn đang tìm kiếm là response.write, trong đó có một đoạn dữ liệu để gửi như một cơ thể phản ứng. Sau đó tôi tin rằng bạn có thể sử dụng response.end trên tín hiệu kết thúc.

0

Đối tượng phản hồi có thể được ghi vào. Trong trường hợp của bạn, sau đây sẽ là một giải pháp:

renderFile(file, function(data) { 
    response.send(data); 
}); 
response.end(); 

Nếu bạn có cơ hội để có được các tập tin như một dòng suối này có thể được sắp xếp hợp lý hơn nữa:

file.getReadableStream().pipe(response); 
Các vấn đề liên quan