【问题标题】:nodejs write after request end errornodejs在请求结束后写入错误
【发布时间】:2016-04-27 18:12:30
【问题描述】:

我在 nodejs 请求结束后面临写入问题: 我有一个 server.js 文件,它将请求发送到其他 js 文件(比如 abc.js),该文件将响应发送回 server.js 文件,然后 server.js 文件写入响应,然后结束响应。

我的问题是,如果我在 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,那么它工作正常。

提前致谢:)

【问题讨论】:

  • 贴出完整代码,因为这半个代码,语法错误无济于事。
  • 嗨 Marcos,感谢您的快速响应,但关于代码,我确信没有语法错误,代码工作正常..上面的代码只是解释了我如何处理请求和结束响应。尽管这在 5-6 个请求之前都可以正常工作,但随着请求的增加,我的服务会中断。如果我在需要 url 后由 server.js 调用的文件中使用这个“res.wrrite 和 res.end”,那么一切都很完美。
  • 您调用的其他文件的代码在哪里,问题发生在哪里...
  • 真的很抱歉,现在我也添加了第二个文件的代码
  • 还找不到问题,我运行了一千个请求,但我没有发生这种情况:(

标签: javascript node.js


【解决方案1】:

上面代码的问题是,我通过调用 server.js 的导出函数发回响应 像这样:

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

其中 result() 是我在 server.js 中导出的用于编写响应和结束响应的函数

而不是这个,现在我在调用其他文件(ex-apps.js)的函数时添加了回调支持,这样我只有在实际调用的函数给出时才“res.write”和“res.end()”回复回复。 (我没有写完整的代码,请参考上面的代码以了解两者的区别) httpd.on('request', function(req, res) { url = __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 的函数然后编写响应来发回结果时......我不知道如何......但不知何故,服务器在多个请求中感到困惑并说“结束后写入”错误...虽然结尾是由其他用户的请求调用的。

我可能是错的,但这就是我从中得出的结论:) 我希望这可以帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2020-03-20
    • 2017-01-08
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多