Подтвердить что ты не робот

Как установить тип MIME перед отправкой файла в Node.js?

При отправке сценариев с моего сервера Node.js в браузер, в Google Chrome, я получаю следующее предупреждение:

Ресурс интерпретируется как Script, но передается с типом MIME текст/обычный

Я нашел Google и выяснил, что это проблема на стороне сервера, а именно, я думаю, что перед отправкой я должен установить правильный тип 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, а не "устанавливать" его.)

4b9b3361

Ответ 1

Я понял это!

Благодаря @rdrey link и этот node модуль Мне удалось правильно установить тип 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.");
    }
}

Ответ 2

Найдите google для заголовка HTTP Content-Type.

Затем выясните, как установить его с помощью http://expressjs.com/api.html#res.set

К сожалению, пример включает ваш ответ;)

Просто проверьте завершение файла, если он .js, установите соответствующий тип MIME, чтобы сделать браузеры счастливыми.

EDIT: Если это чисто node, без выражения, смотрите здесь: http://nodejs.org/api/http.html#http_response_setheader_name_value

Ответ 3

У меня были проблемы с использованием функции обработчика, потому что функции 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.");
    }
}

Ответ 4

mime.lookup() теперь переименовывается в mime.getType(). Таким образом, вы можете сделать следующее:

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