Nodejs Express中使用app.all('*',)设置404页面,样式和js外链也跳转问题
Nodejs Express中使用app.all(’’,)设置404页面,样式和js外链也跳转问题 我是新手,用Express做路由配置时,使用
app.all(’
结果我head中的 <link rel=“stylesheet” href=“stylesheets/style.css”>
样式也都跳转到了404页面,请问这个问题怎么解决?
Node.js Express中使用app.all('*', ...)
设置404页面,样式和JS外链也跳转问题
问题描述
我在使用Express框架进行路由配置时,尝试通过app.all('*', ...)
来设置一个全局的404错误处理页面。具体代码如下:
app.all('*', function(req, res) {
res.render("404");
});
然而,在这种方式下,即使访问不存在的资源,页面内的样式表(例如<link rel="stylesheet" href="stylesheets/style.css">
)也会被解析为404错误,导致页面样式丢失。
解决方案
为了正确处理404错误并确保静态文件能够正常加载,你可以将静态文件的中间件放在404错误处理中间件之前。这样可以确保Express首先尝试匹配静态文件路径,如果找不到静态文件,则会触发404错误处理。
以下是具体的解决方案步骤:
- 配置静态文件服务:使用
express.static
中间件来提供静态文件。 - 定义404错误处理:使用
app.use
来定义全局的404错误处理函数。
示例代码
const express = require('express');
const path = require('path');
const app = express();
// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));
// 定义404错误处理中间件
app.use((req, res, next) => {
// 如果请求未匹配到任何路由,则渲染404页面
res.status(404).render("404");
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
-
app.use(express.static(path.join(__dirname, 'public')));
- 这行代码指定了Express如何查找静态文件。在这个例子中,静态文件位于项目的
public
目录下。 public
目录应该包含你的CSS、JavaScript和其他静态文件。
- 这行代码指定了Express如何查找静态文件。在这个例子中,静态文件位于项目的
-
app.use((req, res, next) => { ... });
- 这是一个全局的错误处理中间件。当Express找不到匹配的路由时,它会调用这个中间件,并且状态码会被设置为404。
- 使用
res.status(404).render("404");
来渲染一个自定义的404页面。
通过这种方式,你可以确保静态文件能够正确加载,同时也能正确处理404错误。
在使用 app.all('*', ...)
设置全局404页面处理时,确实会将所有未匹配到的路由都导向404页面。这会导致你的静态文件(如CSS、JS)也被错误地重定向。
要解决这个问题,你可以通过以下几种方式:
方法一:明确指定静态文件路径
确保你在应用中间件之前定义静态文件服务,这样Express可以先匹配静态文件路径,再匹配其他路由。
const express = require('express');
const path = require('path');
const app = express();
// 在所有路由之前设置静态文件服务
app.use(express.static(path.join(__dirname, 'public')));
// 全局404处理
app.all('*', (req, res) => {
res.status(404).render("404");
});
app.listen(3000, () => console.log('Server is running on port 3000'));
确保你的HTML文件中引用的CSS或JS文件路径正确,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
<link rel="stylesheet" href="/stylesheets/style.css">
</head>
<body>
<!-- Your content here -->
</body>
</html>
方法二:使用app.use()
和app.get()
另一种方法是明确使用 app.use()
来定义静态文件服务,并使用 app.get('*')
来处理404错误。
const express = require('express');
const path = require('path');
const app = express();
// 设置静态文件服务
app.use(express.static(path.join(__dirname, 'public')));
// 处理GET请求的所有未匹配路由
app.get('*', (req, res) => {
res.status(404).render("404");
});
app.listen(3000, () => console.log('Server is running on port 3000'));
以上两种方法都可以确保静态文件被正确加载,而不会被错误地重定向到404页面。希望这能解决你的问题!