我正在製作一個相當簡單的快速應用程序只有幾條路線。我的問題不是關於應用程序的功能,而是關於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/plain
或text/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」
它就在那裏!我注意到我正在閱讀的文檔中的「application/octet-stream」,並且認爲某種猜測正在做什麼類型的返回,但這是我失蹤的一部分。非常感謝。 –