web-dev-qa-db-ja.com

Node.jsでファイルを送信する前にMIMEタイプを設定するにはどうすればよいですか?

Node.jsサーバーからブラウザにスクリプトを送信すると、Google Chromeで次の警告が表示されます。

リソースはスクリプトとして解釈されますが、MIMEタイプtext/plainで転送されます

私はグーグルで調べて、それがサーバー側の問題であることを発見しました。つまり、送信する前に、正しい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タイプを特定するだけで、「設定」することはできません。)

20
corazza

私はそれを考え出した!

@rdreyの link および this 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.");
    }
}
19
corazza

GoogleでContent-Type HTTPヘッダーを検索します。

次に、それを http://expressjs.com/api.html#res.set で設定する方法を理解します

おっと、例にはあなたの答えが含まれています;)

ファイルの末尾を確認するだけです。.jsの場合は、適切なMIMEタイプを設定してブラウザを満足させます。

編集:これがエクスプレスなしの純粋なノードの場合、ここを見てください: http://nodejs.org/api/http.html#http_response_setheader_name_value

7
rdrey

mime.lookup()mime.getType()に名前が変更されました。だからあなたはこのようにすることができます:

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

https://www.npmjs.com/package/mime

3
Pei

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.");
    }
}
2
Juan Nogueira