2015-05-18 104 views
0

我正在嘗試創建一個並行運行的服務器。我有兩個主要的擔憂:NodeJS導出阻止代碼

  1. 某些方面阻止和停止正在處理
  2. 請求弄混和錯誤的反應去錯了客戶的請求。

這裏是我的代碼:

服務器文件:

var http = require('http'); 
var controller = require('controller.js'); 
http.createServer(function (request, response) { 
    controller.handle(request, response); 
}).listen(8080, '0.0.0.0'); 

控制器文件

var resp = require('./resp.js'); 
var sqltest = require('/sql/sqltest.js'); 

exports.handle = function(request, response) { 
    request.on('data', function(chunk) { 
     var json = JSON.parse(chunk); 
     var type = parseInt(json["requestType"]); 

     switch(type) { 
      case 0: 
       sqltest.try(json, function(res){ 
       resp.send(response, res); 
       }); 
      break; 
     } 
    }); 
} 

SQL測試文件

var mysql = require('mysql'); 
    exports.try = function(json, callback, res) { 
    -- doo database stuff -- 
    callback(res); 
    }); 
} 

響應文件

exports.send = function(response, res){ 
    response.writeHead(200, ......); 
    response.end(res); 
} 

基本上,這個服務器將非常大,我不能有行代碼成千上萬都坐在一個文件。通過分解,我會以任何方式損害性能,這是否會導致任何阻止代碼,服務器是否會跟蹤正確的客戶端以響應?

我還是非常新的節點和JavaScript的一般,所以也許我很想理解基本概念如何工作。任何建議或改進將是一個很大的幫助!

+0

這些都不是問題。 – SLaks

回答

0

對於關注點#1,您所發佈的代碼中沒有任何代碼被阻止,但您有權關注此問題。節點是單線程的,編寫阻塞或需要很長時間計算的代碼在節點中是一個壞主意。好消息是節點非常異步。雖然可以在節點中編寫阻止代碼,但是常用庫的設計方式不同,但您必須自行編寫阻止函數。

這SO答案有很多很好的細節,以幫助包裝你的頭周圍:https://stackoverflow.com/a/14797359/77501

關注#2,我不知道你的意思。你是否擔心會調用一個SQL異步回調函數,以致某個res var以某種方式指向別人的請求?

關於最底層的blurb,如果在一個文件中包含所有代碼,就不會對性能產生明顯的影響。如果任何應用程序可能啓動的速度稍微快一點,因爲它將加載更少的模塊。

由於其他原因,將大量代碼壓縮到單個文件中是一個糟糕的主意。將代碼拆分爲模塊將使您的代碼更加可重用,從而使您可以更少地編寫代碼。代碼越少越好。通過將您的數千行代碼分解爲所有「一件事情都做好」(又稱凝聚力)的模塊,將使您的代碼更容易理解,更容易構建,更容易調試。