我有一个节点服务器正在运行,我正在试图弄清楚如何传达我的服务器上的文件路径(以及如何响应获取这些资源的请求),这样我基本上有一个静态文件服务器,但是我可以根据请求参数(POST
或GET
等)控制的。现在我的文件结构设置如下(dir_
表示目录):
Main Folder:
server.js
dir_content:
home.html
style.css
dir_uploads:
dir_finished:
file1.txt
file2.txt
要回复我的请求,我的代码如下所示:
http.createServer(function(request, response) {
if(request.method.toLowerCase() == 'get') {
var filePath = './dir_content' + request.url;
if (filePath == './dir_content/') {
filePath = './dir_content/home.html';
}
fs.exists(filePath, function (exists) {
if (exists) {
fs.readFile(filePath, function (error, content) {
if (error) {
response.writeHead(500);
response.end();
}
else {
response.writeHead(200, {'Content-Type': contentType});
response.end(content, 'utf-8');
}
})
这允许我使用正确的页面(如果存在)响应任何GET
网页请求,但它最终会扭曲我服务器上资源的路径。
示例:尝试检索file1.txt的人会导航到localhost:8080/dir_content/dir_uploads/dir_finished/file1.txt
但我的代码会在其请求中添加额外的./dir_content
,使其看起来像是在尝试访问:
localhost:8080/dir_content/dir_content/dir_uploads/dir_finished/file1.txt
是否有更简单的方法可以为 WITHOUT 外部节点模块中的资源提供准确的绝对路径(通过某种方式设置某种基本目录)?
答案 0 :(得分:0)
乍一看,您似乎没有考虑request.url,可能包括dir_content前缀。如果确实如此,那么我建议进行一个简单的正则表达式测试,看它是否存在:
if (!/^[\/]?dir_content\//i.test(request.url))
filePath = '/dir_content' + request.url;
filePath = '.' + filePath;
简单的小提琴演示正则表达式: