我有以下代码发送页面.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();
}
}