共享响应对象 nodejs



我有以下代码发送页面.html或节点中的任何其他html文件。 我使用了很多嵌套(示例 1),如果我不使用它并使用命名函数(示例 2),我必须声明变量来保存响应,是否有更好但简单的替代方案,如绑定或任何其他策略?

// Sample 1
var http = require('http'); 
var fs = require('fs');
var server = http.createServer(); 
server.on("request",requestHandler);
server.listen(8080);
function requestHandler(request,response){
    var regPageName = /(w+.w+)+$/;
    var urlRequested = request.url;
    var match = regPageName.exec(urlRequested);
    if(match!=null){
        var fileName = match[1]; // first capture group is filename
        // check for existence of file
        fs.exists(fileName,function(doesExist){
            if(doesExist){
                // file exists dump it now
        response.writeHead(200,{"Content-Type": "text/html"});
        fs.readFile(fileName,function(err,data){
          if(err){
            throw err;
          }
          else{
            response.write(data.toString());
            response.end();
          }
        }); // readfile
            }// exists
            else{
                response.writeHead(404,'Not Found');
                response.end();
            }
        })
    }
    else {
        response.writeHead(400,'Bad Request');
        response.end();
    }

}

这是示例 2

// Sample 2
var http = require('http'); 
var fs = require('fs');
var glrequest;
var glresponse;
var glfilename ;
var server = http.createServer(); 
server.on("request",requestHandler);
server.listen(8080);
function requestHandler(request,response){
  glrequest = request;
  glresponse = response;
    var regPageName = /(w+.w+)+$/;
    var urlRequested = request.url;
    var match = regPageName.exec(urlRequested);
    if(match!=null){
        var fileName = match[1]; // first capture group is filename
        glfilename = fileName;
        // check for existence of file
        fs.exists(fileName,CheckExistence);
    }
    else {
        response.writeHead(400,'Bad Request');
    response.end();
    }
}// requestHandler
function CheckExistence(doesExist){
  if(doesExist){
    // file exists dump it now
    glresponse.writeHead(200,{"Content-Type": "text/html"});
    fs.readFile(glfilename,dumpData); // readfile
  }// exists
  else{
    glresponse.writeHead(404,'Not Found');
    glresponse.end();
  }
}
function dumpData(err,data){
  if(err){
    glresponse.end();
    throw err;
  }
  else{
    glresponse.write(data.toString());
    glresponse.end();
  }
}

将局部变量传递给命名函数的一种简单方法是将其包装在匿名函数(或与变量位于同一作用域的局部函数)中。例如:

        fs.exists(fileName,function(exists) { CheckExistence(exists, filename); );
    ...
    function CheckExistence(doesExist, filename){
        if(doesExist){
        ...

正如我在评论中提到的,不鼓励在 Node.js 文档中使用 fs.exists()

我实施了fd的建议并提出了以下解决方案。 欢迎改进:)

var http = require('http'); 
var fs = require('fs');
var server = http.createServer(); 
server.on("request",requestHandler);
server.listen(8080);
//1
function requestHandler(request,response){
    var regPageName = /(w+.w+)+$/;
    var urlRequested = request.url;
    var match = regPageName.exec(urlRequested);
    if(match!=null){
        var fileName = match[1]; // first capture group is filename
        // check for existence of file
        fs.exists(fileName,function(doesExist){
      CheckExistence(doesExist,fileName,response);}
    );
    }
    else {
        response.writeHead(400,'Bad Request');
    response.end();
    }
}// requestHandler
//1.1
function CheckExistence(doesExist,fileName,response){
  if(doesExist){
    // file exists dump it now
    response.writeHead(200,{"Content-Type": "text/html"});
    fs.readFile(fileName,
      function(err,data){
      dumpData(err,data,response);}
    ); // readfile
  }// exists
  else{
    response.writeHead(404,'Not Found');
    response.end();
  }
}
//1.1.1
function dumpData(err,data,response){
  if(err){
    response.end();
    throw err;
  }
  else{
    response.write(data.toString());
    response.end();
  }
}

最新更新