使用'utf-8'时,是否应该使用特定的mimeTypes才能正确呈现静态文件?

时间:2018-08-09 12:12:53

标签: node.js mime-types

在我的节点路由器中,我有一些可以完全覆盖静态文件的代码。我想知道仅指定utf-8时使用mimeType更具体是否有优势?

module.exports = function router (req, res) {
  if (req.url === '/messages' && req.method === 'GET') {
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(db.msgs));
  } else if (req.url === '/messages' && req.method === 'POST') {
    db.msgs.push(req.body); //req.body is already JSON
    res.end();
  } else {
    //catchall for static files
    if (req.url === '/') req.url = '/index.html';
    if (req.url.indexOf('.') !== -1) {
      const filePath = clientPath + req.url;
      fs.readFile(filePath, (err, data) => {
        if (err) {
          res.statusCode = 500;
          res.end();
        } else {
          let ext;
          //all file types work can be encoded as utf-8, but if you wish to be more explicit, you can use mimeTypes...
          if (req.url.match(/js/)) ext = 'application/javascript';
          if (req.url.match(/css/)) ext = 'text/css';
          if (req.url.match(/html/)) ext = 'text/html';
          if (!ext) ext = 'utf-8';
          res.end(data, ext);
        }
      });
    } else {
      res.statusCode = 404;
      res.end();
    }
  }
};

1 个答案:

答案 0 :(得分:0)

这里的问题是,MIME类型是res.end的无效参数,因此无论如何在任何情况下它都默认为utf-8

正确发送MIME类型的方法是HTTP标头Content-Type

MIME类型没有优于编码的优点,它们是独立的:

编码确定您在编辑器中看到的文本如何转换为发送到客户端的二进制表示形式。

MIME类型告诉客户端如何解释已解码的文本数据,即是将其用作JavaScript还是CSS。

HTML文件的Content-Type标头通常如下所示:

Content-Type: text/html; charset=utf-8

在许多情况下,MIME类型只是一个方便的助手,可以使客户端在某些时间试图猜测数据是安全的时候安全。例如。对于文本内容,您可以遍历多个解析器,然后查看哪个解析器有效,但具有指定的MIME类型,则知道要使用哪个解析器。