2011-07-09 25 views
5

Tôi đang gặp một số rắc rối với Node.js và tôi nghĩ rằng vấn đề có thể là tôi hiểu nhầm cách tiếp cận của Node.js để đồng thời. Đây là một ví dụ bị tước đi của máy chủ mà tôi đã viết. Ý tưởng là máy chủ sẽ được sử dụng để thử nghiệm tự động: nó giữ một danh sách các "cấu hình" dự kiến ​​và so sánh chúng với "cấu hình" được gửi bởi máy khách.Theo dõi gỡ lỗi Node.js dường như ngụ ý nhiều luồng thực thi - cách diễn giải chính xác điều này?


//expectedConfigurations gets initialized up here 

var server = http.createServer(function(request, response) { 
    switch (url.pathname) { 
     case "/check-configuration": 
      jsonData = ""; 
      request.on("data", function(data) { 
       return jsonData += data; 
      }); 

      request.on("end", function() { 
       var configuration, errMsg, expectedConfiguration; 

       console.log("finished reading json data", jsonData); 
       expectedConfiguration = expectedConfigurations.shift(); 
       console.log("Expected configuration", expectedConfiguration); 
       configuration = new Set(JSON.parse(jsonData)); 
       if (expectedConfiguration.equals(configuration)) { 
        response.writeHead(200, {"Content-Type": "text/plain"}); 
        response.write("Matched expected configuration."); 
        return response.end(); 
       } else { 
        response.writeHead(500, { 
         "Content-Type": "text/plain" 
         }); 
        errMsg = "Did not match expected configuration. Received: " + (JSON.stringify(configuration)) + ". Expected:" + (JSON.stringify(expectedConfiguration)) + "."; 
        response.write(errMsg); 
        response.end(); 
        console.error(errMsg); 
        results.testsFailed.push(currentTest); 
        return transitionToBeforeSendingTestState(); 
       } 

      }) 
    } 
}) 

sự hiểu biết của tôi là Node.js là đơn luồng, vì vậy trong khi nó có thể đẻ trứng nhiều nhiệm vụ mà có thể bị xử lý không đồng bộ, chỉ có một sợi thực hiện tại một thời điểm sẽ nhập mã JavaScript chạy dưới Node.js . Thật không may, sản lượng gỡ lỗi tôi nhận được từ máy chủ của tôi dường như thách thức giả định này:


received request for /check-configuration 
finished reading json data [ "a" ] 
Expected configuration [ "a" ] 
received request for /check-configuration 
Did not match expected configuration. Received: [ "a" ]. Expected: [ "c" ]. 

Tôi đọc như sau:

  1. server nhận được yêu cầu. Nó bắt đầu đọc dữ liệu yêu cầu một cách không đồng bộ.
  2. máy chủ đọc xong dữ liệu yêu cầu, đột biến expectedConfigurations bằng cách thay đổi nó, và gán kết quả cho expectedConfiguration [ 'a' ]
  3. thread sau đó bị gián đoạn bởi một yêu cầu mới cho máy chủ! đây là nơi mà kỳ vọng của tôi về việc thực thi một luồng nội dung JavaScript trong Node.js dường như bị hỏng.
  4. cuối cùng, chuỗi thực thi ban đầu được kết hợp với yêu cầu đầu tiên sẽ tiếp tục. Cấu hình dự kiến ​​được so sánh với cấu hình thực tế nhận được, nhưng bây giờ, thay vì có giá trị [ 'a' ], như đã làm ở bước 2., nó có giá trị ["c"].

Có vẻ như tôi phải giải thích điều này không chính xác, vì nó làm mất hiểu biết của tôi về mô hình thực hiện luồng đơn của Node.js, nhưng hiện tại tôi không thể hiểu được điều này. Tôi đánh giá cao bất kỳ hướng dẫn bất cứ ai có thể cung cấp về điều này.

Trả lời

1

cố gắng lặp lại kiểm tra tương tự bằng console.error thay vì console.log ở mọi nơi. Theo như tôi biết, console.log không bị chặn (dữ liệu được đệm tại thời điểm cuộc gọi và được ghi vào stdout tại một số điểm sau đó) và console.error đang chặn.

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