我有两个问题:
1号:
我正在尝试提出一个正则表达式,它将返回在 URL 末尾找到的文件扩展名:
例如
假设 URL 中的文件扩展名只能以这种格式出现:
.../.../..../..../filename.fileextension
.
我得到的文件扩展名如下(请原谅我受 C++ 启发的语法,阅读这样的代码对我来说更容易/更干净):
var fileExtension;
if (document.location.href.match(/.*\.(.*)$/) && document.location.href.match(/.*\.(.*)$/)[1])
{
fileExtension = document.location.href.match(/.*\.(.*)$/)[1];
}
我希望上面的 RegEx 意味着匹配 URL 中最后一个点之后的所有内容。
是这种情况还是上述RegEx会失败的情况?如果是这样,正确的正则表达式是什么?
2号:
我之所以要执行上述操作,是因为我想设置我的第一个 Node.js 服务器,并且我正在努力使其尽可能高效。每当收到针对特定文件的请求时,我都想遍历所有可能的文件扩展名的数组,找到正确的文件扩展名,并在响应的头部返回适当的内容类型。出于这个原因,我创建了一个 JSON 文件 (content-types.json),其中包含所有可能的文件扩展名(准确地说是 646..)以及相关的内容类型。它看起来像这样:
{
"3dm" : "x-world/x-3dmf",
"3dmf" : "x-world/x-3dmf",
"a" : "application/octet-stream",
"aab" : "application/x-authorware-bin",
"aam" : "application/x-authorware-map",
......etc.
}
因此,使用上面的 JSON 文件,我正在创建我的 server.js,如下所示:
var http = require('http');
var fs = require('fs');
var contentTypes = JSON.parse(fs.readFileSync("content-types.json"));
var host = "127.0.01";
var port = 1825;
var server = http.createServer(function (request, response)
{
fs.readFile("." + request.url, function (error, data)
{
if (error)
{
response.writeHead(404, {"Content-type" : "text/plain"});
response.end("something went wrong");
}
else if (request.url.match(/.*\.(.*)$/) && request.url.match(/.*\.(.*)$/)[1])
{
var extension = request.url.match(/.*\.(.*)$/)[1];
var contentType;
var found = false;
// now I'll loop through the content-types object and look for a match
// if a match is found then
// found = true;
// contentType = contentTypes[extension];
if (!found)
{
response.writeHead(404, {"Content-type" : "text/plain"});
response.end("wrong file extension");
}
else
{
response.writeHead(200, {"Content-type" : contentType});
response.end(data);
}
}
else
{
response.writeHead(404, {"Content-type" : "text/plain"});
response.end("file extension not recognised");
}
});
});
server.listen(port, host, function ()
{
console.log("listening " + host + ":" + port);
});
你觉得上面的方法有效吗?我只是想避免做类似“如果扩展名是 js 则使用此内容类型,如果是 css 则使用 this..etc”之类的事情。但是,确实我正在读取/循环一个包含 646 个扩展的 JSON(对于每个请求),所以从性能的角度来看,我也不知道这是否明智。
我还想澄清一下,我不想在这种情况下使用 Express.js(尽管可以举个例子)。我试图将事情保持在尽可能低的水平,因为我是一个菜鸟,我想先了解事情是如何运作的。
另外,正如您所知道的,我没有编写合适的循环来寻找正确的内容类型,因为基本上我不知道如何循环遍历一个对象。我应该改用对象数组吗?但是在那种情况下,我将无法将其保存为我可以简单阅读的外部文件吗?我相信它必须是一个 JSON 文件。那么如何在上述场景中遍历该 contentTypes 对象,以便根据给定的扩展键获取适当的 contentType 呢?
预先感谢您的任何帮助!:)