2017-05-13 4 views
0

私はいくつかのルートでかなり簡単なエクスプレスアプリを作っています。私の質問は、アプリケーションの機能についてではなく、Expressルートの動作の奇妙なビットについてです。一部の無効なMIMEタイプが "TypeError"を引き起こし、他の無効なMIMEタイプがエラーをバイパスして、プロンプトされないダウンロードをトリガーするのはなぜですか?

私はサーバを起動し、/search/*ルート、またはパラメータにとる任意の経路を使用して、私が応答にこれらの4つのコンテンツ・タイプのいずれかを適用します。

  • 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を使用すると、サイズが6バイトで、サポートされていないファイルタイプの "foobar"という名前のファイルがダウンロードされます。今私は、これらの4つのタイプのどれも実際の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');

いくつかの無効なタイプがエラーを引き起こし、他の無効なタイプがエラーを回避してダウンロードをトリガーするのはなぜですか?私がこれまでに出て見つけた何

を私は、res.download(path [, filename])は「添付ファイル」としてパスでファイルを転送し、通常はダウンロードのためにユーザーに要求することExpressの4.xのドキュメントで見られますこのダウンロードは促されも意図的でもありません。

ルートを実行しているファイルが自動的にコンピュータにダウンロードされたExpressドキュメント(またはここではSO)では、このような状況は見つかりませんでした。

は、最初に私はラインres.send(typeof(res));がダウンロードを引き起こしていたと思ったが、一度にライン1をコメントアウトして、サーバーを再実行した後、私は、コンテンツタイプが'plain/text'に設定されている場合のみ、ダウンロードをしていることを把握することができました起こる。 res.send()の内容に関係なく、content-typeがplain/textの場合、/search/の後のテキストが自分のマシンにダウンロードされます。ルートを再配置

が(それは、ダウンロードを除く必要があるとして、すべてが働いていた。)

同じ結果に到達したアプリはちょうどどんなルートでハング/search/foo前に達したが、ダウンロードはまだ伝わってくるました。

マイコード:Cloud9

  • 午前エクスプレス初心者を使用して

    '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; 
    

    その他の詳細

    • Expressバージョン4.15.2
    • ノードバージョン4.7.3
    • 私のレポは「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

    hereです/ search/* 'ルート。

    +0

    (強調鉱山)は、任意の組み合わせは、それが必要のように動作しますが、それでも限り、ダウンロードが発生しますsetHeader行が存在します。それがどんなアイデアなのか? –

    +0

    申し訳ありませんが、なぜ 'text/html'ではなくplain/textなのですか?また、 'plain/text'ではなく、 'text/plain'でもかまいませんか? –

    +0

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

    関連する問題