2017-05-13 46 views
0

我正在製作一個相當簡單的快速應用程序只有幾條路線。我的問題不是關於應用程序的功能,而是關於Express路線的一些奇怪行爲。爲什麼一些無效的MIME類型會觸發「TypeError」,而其他無效的MIME類型會繞過該錯誤並觸發自動下載?

當我啓動服務器,並使用/search/*路線,或發生在一個參數的任何途徑,我申請這四個內容類型的反應之一:

  • res.setHeader('content-type', 'plain/text');
  • res.setHeader('content-type', 'plain/html');
  • res.setHeader('content-type', 'html/plain');
  • res.setHeader('content-type', 'html/text');

該參數作爲文件下載,沒有任何提示。因此,使用search/foobar會下載一個名爲「foobar」的文件,其大小爲6個字節,並且不受支持的文件類型。現在我明白,這四種類型都不是真正的MIME類型,我應該使用text/plaintext/html,但爲什麼下載?這兩個MIME類型的行爲像他們應該和下面的MIME類型與類型,但沒有亞型全部失敗應該像他們,他們都返回TypeError: invalid media type錯誤:

  • res.setHeader('content-type', 'text');
  • res.setHeader('content-type', 'plain');
  • res.setHeader('content-type', 'html');

爲什麼一些無效類型會觸發錯誤,其他無效類型會繞過錯誤並觸發下載?

什麼我發現了迄今:

我在快遞4.x的文檔發現,res.download(path [, filename])在傳輸路徑作爲一個文件「附件」,並且通常會提示用戶進行下載,但是這種下載既沒有提示也沒有故意的。

我無法在快速文檔(或SO中的這裏)中找到任何類似的情況,其中運行路徑導致文件自動下載到您的計算機。

起初我還以爲行res.send(typeof(res));是導致下載,但一次註釋掉行之一,並重新運行該服務器後,我能弄清楚,只有當內容類型設置爲'plain/text'確實下載發生。 res.send()內的內容無關緊要,當內容類型爲純文本/文本時,/search/之後的文本將下載到我的機器中。

重新安排航線達到同樣的結果(一切工作,因爲它應該除了下載。)

該應用程序只是掛在/search/foo之前達到了無論走哪條路線,但下載仍然來自通過。

我的代碼:

'use strict'; 
var express = require('express'); 
var path = require('path'); 

var app = express(); 

app.get('/', function (req, res) { 
    res.sendFile(path.join(__dirname+'/index.html')); 
}); 


app.get('/search', function(req,res){ 
    res.send('search route'); 
}); 
app.get('/search/*', function(req, res, next) { 
    res.setHeader('content-type', 'plain/text'); 
    var type = typeof(res); 
    var reqParams = req.params; 
    res.send(type); 
}); 


var server = app.listen(process.env.PORT || 3000, function(){ 
    console.log('app listening on port ' + process.env.PORT + '!'); 
}); 

module.exports = server; 

其他信息

  • 快遞版本4.15.2
  • 節點版本4.7.3
  • 使用CLOUD9
  • 上午快遞新手
  • 我的回購是here,下設分支「so_question」

回答

1

Why do some invalid types trigger an error...

因爲MIME類型都有它應該堅持格式(RFC 2045記錄),和那些觸發錯誤不匹配的格式。

的格式如下:

type "/" subtype *(";" parameter) 

所以這是一個強制性的類型,強制性的斜線,強制亞型,並可選參數用分號前綴。

然而,當一個MIME類型的格式相匹配,這只是語法上是有效的,不一定語義,這給我們帶來的問題的第二部分:

...and other invalid types bypass the error and trigger a download?

從使下面是寫在RFC 2049

Upon encountering any unrecognized Content-Type field, an implementation must treat it as if it had a media type of "application/octet-stream" with no parameter sub-arguments. How such data are handled is up to an implementation, but likely options for handling such unrecognized data include offering the user to write it into a file (decoded from its mail transport format) or offering the user to name a program to which the decoded data should be passed as input.

(重點煤礦)

+0

它就在那裏!我注意到我正在閱讀的文檔中的「application/octet-stream」,並且認爲某種猜測正在做什麼類型的返回,但這是我失蹤的一部分。非常感謝。 –

0

在其中定義您的路線順序快遞問題很多,你可能需要將您的默認「/」路線是後「/search/*'路線。

+0

我試圖重新安排路線,任意組合,如同它應該,但還是引起了下載,只要setHeader行存在。任何想法,爲什麼? –

+0

不好意思,爲什麼plain/text而不是'text/html'。它也可以是'文本/純文本'而不是'純文本/文本'嗎? –

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types –