我有以下代码如下:
function(staticPath) {
console.log('static Path = ' +staticPath);
return function(data, response) {
console.log('data = ' +data);
console.log('response = ' +response);
var readStream;
// Fix so routes to /home and /home.html both work.
data = data.replace(/^(\/home)(.html)?$/i, '$1.html');
data = '.' + staticPath + data;
fs.stat(data, function(error, stats) {
if (error || stats.isDirectory()) {
return exports.send404(response);
}
readStream = fs.createReadStream(data);
return readStream.pipe(response);
});
}
}
此函数基本上解析HTML文件的路径并显示文件的内容。
我无法理解如何从外部调用此方法。
我称之为:
staticFile("D:\\Node Applications\\public\\home.html")
我可以在变量innerFunc
中捕获它,我可以将内部函数称为innerFunc(response)
,其中响应是 http的serverResponse 其中我有我的参考,但我不知道我怎么能通过data
param。
我不了解幕后发生的事情。谁能解释一下?我们经常在javascript中遇到这样的代码吗?
修改: 为了清楚起见: 还有另一种方法如下:
function(data, response) {
response.writeHead(200, {
'Content-Type': 'application/json'
});
response.end(JSON.stringify(data));
}
我从我的节点服务器逻辑调用如下:
http.createServer(function(req, res) {
// A parsed url to work with in case there are parameters
var _url;
// In case the client uses lower case for methods.
req.method = req.method.toUpperCase();
console.log(req.method + ' ' + req.url);
if (req.method !== 'GET') {
res.writeHead(501, {
'Content-Type': 'text/plain'
});
return res.end(req.method + ' is not implemented by this server.');
}
if (_url is something like //localhost:1337/employees) {
//call employee service which returns *data*.
// send the data with a 200 status code
return responder.sendJson(data, res);
});
} else {
// try to send the static file
/*res.writeHead(200);
res.end('static file maybe');*/
console.log('Inside else');
var staticInner = responder.staticFile("D:\\Node Applications\\public\\home.html");
staticInner(res);
}
// res.end('The current time is ' + Date.now())
}).listen(1337, '127.0.0.1');
正如可以看到没有 data 变量传递给 innerFunc 因此,感到困惑。
答案 0 :(得分:1)
根据" innerFunc",似乎data
是一些字符串,与staticPath
连接,形成文件的路径。我们可以看到,该路径已使用fs.stat
进行测试。也许客户端应该发送一些自定义数据?无论如何,data
对于像这样的变量来说似乎是一个非常糟糕的名字。
似乎该功能试图将文件作为响应发送? staticPath
应该是一个相对于此代码所在的Javascript文件的路径,因为它是这样连接的:
data = '.' + staticPath + data;
这将以./some/path/index.html
之类的结尾。 staticPath
的值为/some/path
,data
的值为index.html
。因此,如果您的JS文件位于/home/foo/node/index.js
,那么" innerFunc"将尝试查找将在/home/foo/node/some/path/index.html
。
如果您将[{1}}传递给"D:\\Node Applications\\public\\home.html"
,那么您会得到类似staticFile()
的内容,这显然是无效的文件。
回答函数返回函数的重点
在这种情况下,正如mgouault所说,完全没有意义。也许程序员有一些想法,但在编程时改变了它,函数最终就像那样(有时会发生)。
答案 1 :(得分:0)
您的函数(例如:function(staticPath)
)应该具有名称或存储在变量中以便能够调用它们。所以我猜你将所有这些代码都存储在变量staticFile
中。
然后当您使用参数staticFile("D:\\Node Applications\\public\\home.html")
调用它时,它会返回一个函数(return function(data, response) {...}
)。
现在您已拥有此内部功能,可以使用data
和response
调用它:
var innerFunc = staticFile("D:\\Node Applications\\public\\home.html");
innerFunc(data, response);
哪个会使用您的变量response
(我猜)。
返回函数的函数在javascript中经常出现,特别是在为某些目的使用闭包时,但在这种情况下它并没有真正有用。