2016-01-21 6 views
0

Я столкнулся с проблемой записи после завершения запроса в nodejs: У меня есть файл server.js, который отправляет запрос в другой файл js (скажем, abc.js), который отправляет ответ на сервер. js, а затем файл server.js записывает ответ и затем завершает ответ.nodejs write after request end error

моя проблема в том, что я пишу ответ в 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); 
} 

если я res.write и res.end в этом файле в taskDone(), то он работает отлично.

Заранее спасибо :)

+0

Опубликовать полный код, так как эта половина кода с синтаксической ошибкой не поможет. –

+0

Привет, Маркос, спасибо за быстрый ответ, но про код. Я уверен, что нет синтаксической ошибки, код работает отлично. Более подробно код объясняет, как обрабатывать запрос и конец ответа. Несмотря на то, что это работает нормально до 5-6 запросов, но по мере увеличения запросов мое обслуживание прерывается. и если я использую этот «res.wrrite и res.end» в файле, который вызывается server.js после запроса url, все работает отлично. – user5821368

+0

Где код из других файлов, которые вы вызываете, где проблема возникает ... –

ответ

1

Проблема с кодом выше было то, что я отправлял обратно ответ, вызвав экспортированной функции server.js так:

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

где результат() это функция, которую я экспортировал в server.js, чтобы написать ответ и конец ответа.

Вместо этого теперь я добавил поддержку обратного вызова при вызове функции других файлов (ex-apps.js), чтобы я «res .write "и" res.end() "только wh en фактически вызванная функция возвращает ответ. (я не пишу весь код, см. Выше код для разницы в обоих) 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 сервер был путаться в многочисленных запросов и сказать «написать после окончания "ошибки ... в то время как конец был вызван другим запросом пользователя.

Возможно, я ошибаюсь, но это то, что я сделал из этого :) Надеюсь, это может помочь другим.