2016-08-12 14 views
14

Vấn đềNode server, ổ cắm, request và response timeouts

cấu hình mặc định của Node thờ gian tạm ngưng các yêu cầu sau 2 phút. Tôi muốn thay đổi timeout yêu cầu:

  • 1 phút cho 'bình thường' yêu cầu
  • 5 phút cho các yêu cầu phục vụ các tập tin tĩnh (tài sản lớn trong trường hợp này)
  • 8 giờ cho những lần tải (vài ngàn hình ảnh theo yêu cầu)

Nghiên cứu

Đọc qua Node's documentation, tôi đã phát hiện ra thứ có rất nhiều cách để xác định thời gian chờ.

  1. server.setTimeout
  2. socket.setTimeout
  3. request.setTimeout
  4. response.setTimeout

Tôi đang sử dụng nhanh mà còn cung cấp middleware để xác định thời gian chờ của các tuyến đường (cụ thể). Tôi đã thử điều đó, without success.

Câu hỏi

Tôi đang bối rối về cách cấu hình đúng giới hạn thời gian chờ toàn bộ hoặc từng tuyến đường. Tôi có nên định cấu hình tất cả các thời gian chờ ở trên không? Làm thế nào để thiết lập thời gian chờ của máy chủ khác nhau để thiết lập thời gian chờ của socket hoặc yêu cầu?

+0

không làm ví dụ này giúp https://github.com/expressjs/timeout#connect – AJS

Trả lời

3

Như tôi đã thấy trên your other question concerning the usage of the timeout middleware, bạn đang sử dụng nó theo cách khác.

Xem tài liệu hướng dẫn của timeout-connect middleware.

Thêm errorHandler- chức năng của bạn như là một EventListener để yêu cầu, vì nó là một EventEmitter và middleware làm cho nó phát ra các timeout -event:

req.on("timeout", function (evt) { 
    if (req.timedout) { 
     if (!res.headersSent) { 
     res 
      .status(408) 
      .send({ 
      success: true, 
      message: 'Timeout error' 
     }); 
     } 
    } 
}); 

Đây là được gọi bên ngoài ngăn xếp phần mềm trung gian, khiến cho hàm gọi tới next(err) không hợp lệ. Ngoài ra, bạn phải ghi nhớ rằng nếu thời gian chờ xảy ra khi yêu cầu treo phía máy chủ, bạn phải ngăn mã máy chủ xử lý thêm yêu cầu này (vì tiêu đề đã được gửi và kết nối cơ bản của nó sẽ không còn khả dụng nữa).

+0

Cảm ơn bạn đã trả lời! Làm thế nào tôi có thể ngăn chặn chức năng middleware khác xử lý yêu cầu này, nếu sử dụng 'next()' không hợp lệ ở đây? – Voles

+0

Như các trạng thái của câu trả lời của Nazmul Hossain Bilash, bạn có thể sử dụng một lớp trung gian khác giữa các trình xử lý xử lý yêu cầu kiểm tra 'req.timedout'. Một cách khác sẽ là ghi đè (khỉ-vá) thể hiện 'gọi hàm 'next' và chỉ ngăn chặn nó nếu' req.timedout' là 'true'. – dth

+0

Chỉ cần làm rõ lại, hãy gọi hàm 'next()' không hợp lệ ở đây vì hàm này không phải là phần mềm trung gian hoặc trình xử lý yêu cầu! Nó là một trình xử lý sự kiện và sẽ hành động bên ngoài xử lý yêu cầu của bạn. – dth

3

Tóm tắt

  • nodejs timeout API là tất cả thời gian chờ không hoạt động
  • expressjs/gói thời gian chờ là timeout cứng đáp ứng

nodejs timeout API

server.timeout

  • không hoạt động/Idle Timeout
  • bằng ổ cắm timeout
  • mặc định 2min

máy chủ.setTimeout

  • không hoạt động/Idle Timeout
  • bằng ổ cắm timeout
  • mặc định 2min
  • có callback

socket.setTimeout

  • inactivit y/nhàn rỗi thời gian chờ
  • callback chịu trách nhiệm trước kết thúc(), tiêu diệt() ổ cắm
  • mặc định không có thời gian chờ

response.setTimeout

  • socket.setTimeout kết thúc trước

request.setTimeout

  • socket.setTimeout kết thúc trước

expressjs/timeout gói

  • phản ứng cứng timeout (vs không hoạt động)
  • có callback

Kết luận

  • tối đa. thời gian được phép cho một hành động (yêu cầu + đáp ứng), cần phải có gói Expressout/timeout.

    Đây là những gì bạn cần, nhưng cuộc gọi lại cần phải kết thúc yêu cầu/phản hồi. Khi thời gian chờ chỉ kích hoạt gọi lại, nó không thay đổi trạng thái hoặc can thiệp vào kết nối. Đây là công việc gọi lại.

  • timeout nhàn rỗi, thiết nodejs api request/response timeout

    tôi không khuyên bạn nên chạm vào đó, vì nó không phải là cần thiết trong hầu hết các trường hợp. Trừ khi bạn muốn cho phép kết nối không hoạt động (không có lưu lượng truy cập) trong 2 phút.

+0

Bạn có thể xây dựng kết luận của mình về tối đa không. thời gian được phép cho một hành động? Cảm ơn trước! – Voles

+0

@Voles Theo "Thời gian tối đa cho phép", một hành động (truyền tệp hoặc truy vấn db) được cung cấp một khoảng thời gian nhất định, giả sử 10 phút, sau 10 phút, hành động, nếu chưa hoàn thành, sẽ bị chấm dứt. –

2

Đã có phần mềm kết nối Middleware cho thời gian chờ hỗ trợ. Bạn có thể thử phần mềm trung gian này.

var timeout = express.timeout // express v3 and below 
var timeout = require('connect-timeout'); //express v4 

app.use(timeout(120000)); // should be changed with your desire time 
app.use(haltOnTimedout); 

function haltOnTimedout(req, res, next){ 
    if (!req.timedout) next(); 
} 
+0

Cảm ơn, nhưng còn "Làm cách nào để đặt thời gian chờ của máy chủ khác với cài đặt thời gian chờ của ổ cắm hoặc yêu cầu?"? – Voles