2012-08-15 113 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'));