2012-08-15 111 views
12

当发送从我的Node.js服务器脚本的浏览器,谷歌浏览器,我得到这样的警告:如何在Node.js中发送文件之前设置MIME类型?

资源解释为脚本,但MIME类型 文本传输/纯

我谷歌周围,发现这是一个服务器端问题,即我认为我应该设置正确的MIME类型的东西,然后再发送它们。这里的HTTP服务器的处理程序:

var handler = function(req, res) 
{ 
    url = convertURL(req.url); //I implemented "virtual directories", ignore this. 

    if (okURL(url)) //If it isn't forbidden (e.g. forbidden/passwd.txt) 
    { 
     fs.readFile (url, function(err, data) 
     { 
      if (err) 
      { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      //I think that I need something here. 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 
    else //The user is requesting an out-of-bounds file. 
    { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 

问:如何纠正我的服务器端代码,以正确配置MIME类型?

(注:我已经找到https://github.com/broofa/node-mime,但它只是让我确定MIME类型,而不是 “套” 了。)

回答

15

我想通了!

感谢@ rdrey的linkthis node module我设法正确设置MIME类型的响应,这样的:

function handler(req, res) { 
    var url = convertURL(req.url); 

    if (okURL(url)) { 
     fs.readFile(url, function(err, data) { 
      if (err) { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      res.setHeader("Content-Type", mime.lookup(url)); //Solution! 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } else { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 
6

谷歌搜索的Content-Type HTTP头。

然后弄清楚如何与http://expressjs.com/api.html#res.set

哎呀设置,示例包括你的答案;)

只需选中结尾的文件,如果是.js,设置相应的MIME类型,使浏览器的快乐。

编辑:如果这是纯粹的节点上,没有明示,请看这里:http://nodejs.org/api/http.html#http_response_setheader_name_value

+0

是的,纯节点,没有表达。 – corazza 2012-08-15 15:23:41

+1

好吧,唯一缺少的就是你找出脚本的MIME类型,并将它弹出到每个响应的正确标题中。 – rdrey 2012-08-15 15:27:46

+0

做到了,看到我的答案。 :) – corazza 2012-08-15 16:13:08

0

我不得不用你的处理函数的问题,因为convertURL并在没有定义okURL功能。我修改了代码一点,成品看起来像这样

function handler(req, res) 
{ 
    // /home/juan/Documentos/push-api-demo is the path of the root directory of the server 
    var url    = '/home/juan/Documentos/push-api-demo' + req.url; 
    var file_exists  = fs.existsSync(url); 

    if (file_exists) 
    { 
     fs.readFile(url, function(err, data) 
     { 
      if (err) 
      { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      res.setHeader("Content-Type", mime.lookup(url)); 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 
    else 
    { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 
0

mime.lookup()现更名为mime.getType()。 所以你可以这样做:

res.set('Content-Type', mime.getType('path/file'));