Javascript 从URL抓取文件扩展名,以便使用RegEx返回正确的内容类型-良好实践?

Javascript 从URL抓取文件扩展名,以便使用RegEx返回正确的内容类型-良好实践?,javascript,regex,json,node.js,content-type,Javascript,Regex,Json,Node.js,Content Type,我有两个问题: No1: 我正在尝试使用一个正则表达式,它将返回在URL末尾找到的文件扩展名: e、 g 假设URL中的文件扩展名只能以以下格式显示: ../../../../../filename.fileextension 我将文件扩展名如下(请原谅我的C++启发语法,我读代码更容易/更干净): 我希望上面的正则表达式的意思是匹配URL中最后一个点之后的所有内容 是这样,还是上述正则表达式会失败?如果是这样,正确的正则表达式是什么 No2: 我之所以要执行上述操作,是因为我想建立一个my f

我有两个问题:

No1:

我正在尝试使用一个正则表达式,它将返回在URL末尾找到的文件扩展名:

e、 g

假设URL中的文件扩展名只能以以下格式显示:

../../../../../filename.fileextension

我将文件扩展名如下(请原谅我的C++启发语法,我读代码更容易/更干净):

我希望上面的正则表达式的意思是匹配URL中最后一个点之后的所有内容

是这样,还是上述正则表达式会失败?如果是这样,正确的正则表达式是什么

No2:

我之所以要执行上述操作,是因为我想建立一个my first 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.
}
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);
});
因此,使用上面的JSON文件,我创建了我的server.js,如下所示:

{
  "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.
}
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,那么使用这个..等等”之类的事情 然而,我确实在读取/循环一个包含646个扩展名的JSON(对于每个请求),所以从性能角度看,我也不知道这是否明智

我还想澄清一下,我不想在这个场景中使用Express.js(尽管最好举个例子)。我尽量让事情保持低水平,因为我是一个noob,我想先了解东西是如何工作的

另外,正如您所知,我没有编写适当的循环来查找正确的内容类型,因为我基本上不知道如何循环对象。我应该使用对象数组吗?但在这种情况下,我将无法将其保存为一个我可以直接读取的外部文件?我相信它必须是一个JSON文件。那么,在上面的场景中,我如何循环使用contentTypes对象,以便根据给定的扩展键获取适当的contentType呢

提前感谢您的帮助!:)

只需将MIME放入一个“关联数组”(实际上只是一个命名属性为扩展名的对象),然后将扩展名用作键/索引

mimes = {
   "js":"text/javascript",
   "css":"text/css",
   "json":"application/json"
};
var ext = request.url.split(".").pop();

//Check if the extension mime association exists, if not default to text/html
if( typeof(mimes[ext]) != "undefined" )
   mime = mimes[ext];
else
   mime = "text/html";
如果需要从文件加载MIME,只需将MIME保存在单独的json文件中,并使用ajax,如下所示:

mimes.json

{
   "js":"text/javascript",
   "css":"text/css",
   "json":"application/json"
}

如果URL类似于
http://www.example.com/mywebsite/mypage
?在这种情况下,问题中的正则表达式和Patrick Evans的答案都将
com/mywebsite/mypage
作为文件扩展名。你关心这个案子吗?如果是这样,您可能需要单独处理它,例如,如果第一步的输出包含
/
,则将其更改为
html

该死,您是对的。:)我不必显式地循环对象,只需
contentType=contentTypes[extension]。我还在考虑数组的问题。。至于我的正则表达式,你的意思是我实际上根本不需要一个?我所需要做的就是在点所在的位置拆分URL,这将返回一个由2个元素组成的数组,基本上只使用第2个元素,如果我理解正确,这将始终有效?是的,只需按每个
拆分URL,pop命令拉取末尾的任何一个元素,或者如果没有句点,则整个字符串,这是有意义的。性能方面呢?使用我创建的长JSON文件明智吗?这就是服务器的构建方式吗?每次都使用一长串的文件扩展名来寻找匹配的内容类型,还是我自己太难了,太迂腐了?或者标准做法只是使用较短的文件扩展名列表,考虑到Web开发人员总是知道他们正在构建的特定网站会收到哪些特定的文件扩展名请求?列表中应该只包含那些您愿意在应用程序中接受/使用的文件,否则它会太大,其他未被使用的文件将是多余的,例如,使用jqueryajax,您可以指定返回的数据应该是html、json、xml,与PHP服务器语言相同,您可以指定上传的文件类型,这样您就可以只对需要的文件进行排序。如果你需要在几个不同的js文件中使用它,那么将它保存在一个单独的文件中是很好的,因为它可以减少用户浏览器需要对js文件大小进行调整的请求。是的,我也考虑过这种情况。或者如果url是
http://wrg.com/ersg/sg?wesdg=wsdg.wsg//somefile.js
?这是否会让我的服务器响应相关的.js文件(如果我碰巧有它的话?),即使它不应该响应?我真的不知道如何设置路由,对我来说还是有点困惑。。我知道Express应该使路由更容易,但我还没有找到任何关于这方面的教程,实际上讨论了我们提到的所有这些案例。。