2016-01-21 35 views
0

我面臨着在nodejs中請求結束後寫入的問題: 我有一個server.js文件,它向其他js文件(比如說abc.js)發送請求,並將響應發送回服務器。 js文件,然後server.js文件寫入resoponse,然後結束響應。nodejs在請求結束後寫入錯誤

我的問題是,如果我在abc.js中編寫響應並結束它,只有它可以正常工作,但是如果它在sererconf.js中則不會。

讓我說清楚,只有當我一次發送20-30個請求時,我纔會得到這個錯誤。我想知道它背後的邏輯,我搜索了很多,但沒有發現很好的答案,任何幫助將不勝感激。

server.js full code: 

    /* create HTTP server */ 
    var httpd = http.createServer(function(req, res) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.writeHead(200, {"Content-Type" : "application/json"}); 
    }).listen(3800); 

/* send request to the file mentioned in url*/ 
httpd.on('request', function(req, res) { 
    urll = __dirname + '/..' + req.url; 

    fs.exists(urll, function (exists) { 
     if(exists){ 
     var server = require(urll); 
     server.get(req,res); 
     } 
    }); 

    module.exports = { 
     result : function(result){ 
      if(Array.isArray(result)){ 
       for(var key in result){ 
        result[key] = JSON.parse(result[key]); 
       } 
      } 

      result = JSON.stringify(result);    
       res.write(result ,function(err) { if(!err) res.end(); }); 
     }, 
      }; 
}); 


**apps.js code**: 

var constants = require('./lib/constant.js'); 
var APP_PATH = constants.APP_PATH; 
module.exports = { 

get : function(req) { 
    req.on('data', function(chunk) { 

    var hash = chunk; 
     hash = JSON.parse(hash); 
    var id = hash.id; 

     dirPath = APP_PATH + id; 

     fs.exists(dirPath, function (exists) { 
      if(exists) 
       read_app_dir(dirPath); 
      else 
       taskDone([]);  
     }); 

    }); 
} 
}; 

function read_app_dir(app_dir){ 
fs.readdir(app_dir,function(err, list){ 
    if (err) { 
      httpd.log.info('cannot read apps dir at s_apps = '+err); 
    }else{  
     create_new_obj(list,app_dir); 
    } 
}); 

} 

function create_new_obj(list, app_dir){ 
appFilesObj = []; 
var i  = 0; 

list.forEach(function(file) { 
    i=i+1; 

     file = app_dir +'/' +file; 
     appFilesObj.push(file); 

     if(i == Object.keys(list).length) 
     read_app_files(appFilesObj);  
    }); 
} 

function read_app_files(appFilesObj,app_dir){ 
var apps = []; 
var i = 0; 

if(Object.keys(appFilesObj).length > 0){ 
    appFilesObj.forEach(function(appfile) { 
     read_file(appfile,function(data){ i=i+1; 
      apps.push(data);      
      if(i == Object.keys(appFilesObj).length) 
      taskDone(apps);        
     }); 
    }); 
}else{ 
    taskDone([]);        
} 
} 


function read_file(file,callback){ 
fs.readFile(file,'utf8', function (err, data) { 
    if (err) 
     httpd.log.info('cannot read file at s_apps = '+err);  
    else 
      callback(data); 
}); 
} 

function taskDone(apps){ 
    var httpd = require(__dirname + '/server.js'); 
     httpd.result(apps); 
} 

如果我在taskDone()中的res.write和res.end文件中,那麼它工作正常。

感謝提前:)

+0

發佈完整的代碼,因爲這半個代碼,語法錯誤將無濟於事。 –

+0

嗨馬科斯,感謝您的快速響應,但關於代碼我相信沒有語法錯誤,代碼工作正常..上面的代碼只是解釋我該如何處理請求和結束響應。 雖然這工作正常,直到5-6請求,但隨着請求增加,我的服務中斷。如果我在使用url.js之後在server.js調用的文件中使用這個「res.wrrite和res.end」,那麼每件事情都很完美。 – user5821368

+0

你打來的其他文件的代碼在哪裏,問題發生在哪裏...... –

回答

1

與上述代碼的問題是,我是通過調用server.js的 這樣導出函數發送迴響應:

var httpd = require(__dirname + '/server.js'); 
    httpd.result(apps); 

其中結果()是我在server.js中輸出的函數,用於寫入響應和結束響應

現在我在調用其他文件(ex-apps.js)的函數時添加了回調支持,以便我「res .write「和」res.end()「實際調用的函數會返回響應。 (我沒有寫出整個代碼,請參考上面代碼中的差異) httpd.on('request',function(req,res)urll = __dirname +'/ ..'+ req.url;

fs.exists(urll, function (exists) { 
     if(exists){ 
     var server = require(urll); 
     server.get(req,res,function(result){ 
      res.write(result); 
      res.end(); 
     }); 
     } 
    }); 

**apps.js** 


    get : function(req, callback) { 
    req.on('data', function(chunk) { 
//when task is done and taskDone() function is called I just callback() the result 
    function taskDone(result){ 
     callback(result); 
    } 
    } 
} 

當我通過調用server.js的功能,然後寫響應發送結果回...我不知道how..but莫名其妙服務器在多個請求感到困惑,並說「寫結束後「錯誤...而最後被其他用戶的請求調用。

我可能是錯的,但這是我從這裏得出的結論:) 我希望這可以幫助別人。