express.static 和 CSS 文件的 MIME 类型错误

Posted

技术标签:

【中文标题】express.static 和 CSS 文件的 MIME 类型错误【英文标题】:MIME type error with express.static and CSS files 【发布时间】:2018-10-15 08:44:37 【问题描述】:

我正在使用 Express 和 NodeJS。在我的server.js 文件中,我有这段代码:

app.use(express.static('/static'));

随后在我的静态目录中,我有一个 CSS 文件夹,然后是一个 style.css 文件。在我的index.html 中,我像这样链接到工作表:

  <link rel="stylesheet" type="text/css" href="/static/css/style.css">

但是,在我的测试环境中,我继续收到此错误:

拒绝应用来自 'http://localhost:3500/static/css/style.css' 的样式,因为它的 MIME 类型 ('text/html') 不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查.

我确定我的标签中的路径名是正确的,但我对为什么会收到此错误感到困惑。

我是否需要声明将 CSS 文件作为 CSS 而不是 HTML 处理?当我说type="text/CSS" 时,我不是在这样做吗?如果没有,我需要在我的服务器文件中添加什么来解决这个问题?

【问题讨论】:

【参考方案1】:
app.use(express.static('/static'));

表示静态文件是从/static 直接提供的。在基于 Unix 的操作系统中,这是目录根 / 的直接子级。我不认为你这样做,但你不应该存储文件,更不用说该目录中可公开访问的文件了。相反,您可能正在寻找的是应用程序目录中的 static 目录。

这就是你告诉 express 使用那个服务器文件的方法:

app.use(express.static(__dirname + "/static"));

发生 MIME 类型错误是因为所提供的文件可能是 Express 制作的“404 Not Found”页面,因为它找不到 CSS 文件。浏览器需要一个 CSS 文件,得到一个 HTML 文件并说 MIME 类型不适合。

如果你不能在你的 HTML 中包含一个文件总是双重检查,或者更好的三重检查,那么该文件可以首先通过浏览器访问。

此外,文件位于... href="/...",而不是... href="/static/..."

【讨论】:

如果您希望文件位于 URL /static/.. 而不是 /.. 中,请改用 app.use("/static", express.static(__dirname + "/static")); “发生 MIME 类型错误,因为提供的文件可能是“404 未找到”页面”——这让我大开眼界!我被这个错误蒙蔽了双眼,以至于我没有意识到问题实际上是完全不同的。【参考方案2】:

我有同样的错误,但它是由一个不匹配的情况引起的。我在我的 HTML 文件中写道:

<script src = "./myScript.js"></script>

但实际文件名是MYSCRIPT.js。我没有注意到,因为当我在本地打开 HTML 文件时,浏览器似乎会忽略这一点,甚至会导入大小写不匹配的文件。

【讨论】:

【参考方案3】:

正如其他发帖者所说,这很少是“实际”的 MIME 类型问题。

通常它是定义错误的公共/静态文件配置和不受欢迎的文件的组合。

回答

示例文件结构

// file structure
public/
  assets/
    css/
      stylesheet.css
    images/
      avater.jpeg
  js/ 
    main.js
controllers/
  user
    createUser.js
    readUser.js
models/
  User.js
  index.js
views/
  layouts/
    main.handlebars
  homepage.handlebars
server.js
app.js

/public 文件的基本服务

来自 Express 文档:https://expressjs.com/en/starter/static-files.html

app.use(express.static('public'))

这只有在我们的服务器位于文件系统的根目录时才有效,这对于服务器来说是可以的——对于其他任何东西,都不是。

到 /public 的动态链接

app.use(express.static(__dirname + '/public'))

这将从节点应用程序的目录名称构建公共路径。

它将允许我们将项目文件夹放置在驱动器上的任何位置,而不会妨碍运行时。

使用来自 /public 的文件

// homepage.handlebars
<section>
</section>
<script src="/js/main.js"></script>

上述 Express 文档中提供了说明。

// Sample of file paths created by public/
http://localhost:3000/js/main.js

这意味着当我们链接到该文件时,我们只需将/ 前缀添加到我们的文件/文件夹中。

【讨论】:

【参考方案4】:

我知道这个问题很老了,但想用一个简单的例子来补充我的两分钱,因为我花了一段时间才弄清楚这个问题。

工作示例:

我的文件位于/usr/noah

/usr/noah/index.js

const express = require('express')
const path = require('path')
const app = express()
const port = 8080

app.use(express.static(__dirname + '/static'));

app.get('/', (req, res) => 
    res.sendFile(path.join(__dirname, 'static/index.html'))
);

app.listen(port, () => 
    console.log('Listening on port: ' + port)
);

/usr/noah/static/index.html

<html>

<head>
    <link rel='stylesheet' href='style.css' type='text/css'>
</head>

<body>
    <div id='main'>
        <h1>Hello World</h1>
    </div>
</body>

</html>

/usr/noah/static/style.css

#main 
    margin: 3em;
    padding: 1em;
    border: 1px solid gray;
    border-radius: 10px;


h1 
    color: blue;

然后我使用以下命令从/usr/noah 运行它: node index.js

解释

我倾向于在示例方面做得更好,所以就在上面。要解释出了什么问题,请参见下文:

app.use(express.static('public')) 这在许多快速文档中使用。它就像 alanionita 提到的那样工作得很好,只有当您的服务器位于文件系统的根目录时。如您所知,我在/usr/noah 有两层深。

将此更改为工作示例app.use 确保您的文件从正确的目录提供,在本例中为/usr/noah/static

【讨论】:

以上是关于express.static 和 CSS 文件的 MIME 类型错误的主要内容,如果未能解决你的问题,请参考以下文章

利用 Express 托管静态文件

利用 Express 托管静态文件

express 4.x 模板引擎与express.static

nodejs + express 怎么引入css文件?

它是使用express.static的唯一方法吗?

node框架express里面静态文件中间件express.static,根据路径名查找文件