如何在Node.js中发送文件之前设置MIME类型?

cor*_*zza 20 javascript browser webserver node.js

从我的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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:如何更正服务器端代码以正确配置MIME类型?

(注意:我已经找到https://github.com/broofa/node-mime,但它只允许我确定MIME类型,而不是"设置"它.)

cor*_*zza 20

我想到了!

感谢@ rdrey的链接这个节点模块我设法正确设置了响应的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.");
    }
}
Run Code Online (Sandbox Code Playgroud)


rdr*_*rey 7

在Google上搜索Content-Type HTTP标头.

然后弄清楚如何使用http://expressjs.com/api.html#res.set设置它

哎呀,这个例子包括你的答案;)

只需检查文件结尾,如果是.js,请设置适当的MIME类型以使浏览器满意.

编辑:如果这是纯节点,没有表达,请看这里:http://nodejs.org/api/http.html#http_response_setheader_name_value


Pei*_*Pei 5

mime.lookup()现在更名为mime.getType(). 所以你可以这样做:

res.set('Content-Type', mime.getType('path/file'));
Run Code Online (Sandbox Code Playgroud)

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