Nodejs 使用res.render()发送页面时,页面css文件地址不正确

Nodejs 使用res.render()发送页面时,页面css文件地址不正确

接收请求如下:

app.get('/page/:no', ……);

发送响应如下:

res.render('bla');

响应时,css文件地址前面多了/page,

例如:

GET /bower_components/bootstrap/dist/css/bootstrap.min.css 304 5ms (正确)

GET /page/bower_components/bootstrap/dist/css/bootstrap.min.css 404 3ms (错误,多了/page)

请问要肿么办?


6 回复

当使用 res.render() 方法在 Node.js 中渲染模板并发送到客户端时,有时会遇到静态资源(如 CSS 文件)的路径不正确的问题。这通常是因为模板中的路径没有正确解析,导致路径前多了一个 /page

为了解决这个问题,我们需要确保在模板中正确引用静态资源。以下是解决该问题的步骤和示例代码:

解决方案

  1. 确保静态资源目录正确配置: 首先,需要确保你的静态资源目录已经通过 express.static 正确配置。例如,在应用启动时设置静态资源目录。

  2. 修正模板中的静态资源路径: 确保模板文件中的静态资源路径是相对于根目录的,而不是相对于当前页面的 URL 路径。

示例代码

假设你有一个 Express 应用,并且你希望渲染一个包含 CSS 的页面。以下是一个完整的示例:

const express = require('express');
const path = require('path');

const app = express();

// 设置静态资源目录
app.use(express.static(path.join(__dirname, 'public')));

// 处理路由
app.get('/page/:no', (req, res) => {
    res.render('bla', { no: req.params.no });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

模板文件 views/bla.ejs

确保在模板文件中引用静态资源时使用正确的路径。例如,如果你将 CSS 文件放在 public 目录下,则应这样引用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 正确引用 CSS 文件 -->
    <link rel="stylesheet" href="/bower_components/bootstrap/dist/css/bootstrap.min.css">
</head>
<body>
    <h1>Page No: <%= no %></h1>
</body>
</html>

总结

通过以上步骤,你可以确保在使用 res.render() 发送页面时,CSS 文件的路径不会出现错误。关键在于正确配置静态资源目录,并在模板文件中使用相对路径来引用这些资源。


好吧,没人回答……跑去问老外了 人家说:因为我的卸载html里面的地址最前面没有加/的缘故,不加/表示相对路径…… 为什么我连这个都不知道……

提问link: stackoverflow

叫你不用绝对地址。

express提供了静态文件服务器,为什么不用/static/css/index.css呢

css 的 source 用绝对地址就好了。

当使用 res.render() 方法渲染页面时,如果 CSS 文件路径出现问题,通常是因为模板引擎中的路径解析出现了问题。为了解决这个问题,可以通过确保相对路径的正确性或者使用绝对路径来解决。

假设你使用的是 Express.js 和 EJS 模板引擎,可以通过以下方式修改:

  1. 使用绝对路径: 在模板文件(如 .ejs 文件)中,确保所有资源路径都是从根目录开始的。可以在模板文件中使用 <link> 标签的 href 属性指定绝对路径。

    <!-- 修改后的 link 标签 -->
    <link rel="stylesheet" href="/bower_components/bootstrap/dist/css/bootstrap.min.css">
    
  2. 使用静态文件中间件: 确保你的 Express 应用正确设置了静态文件服务。你可以在应用启动时添加静态文件中间件,以便所有静态文件可以从 /public 或其他目录访问。

    // 设置静态文件目录
    app.use(express.static('public'));
    

    并且在 public 目录下创建一个 css 文件夹,并将 bootstrap.min.css 放入该文件夹中。然后在模板文件中使用:

    <link rel="stylesheet" href="/css/bootstrap.min.css">
    
  3. 动态生成路径: 如果你希望路径是动态生成的,可以考虑在模板中使用变量传递路径信息,这样可以更灵活地管理路径。

    app.get('/page/:no', (req, res) => {
      res.render('bla', { cssPath: '/css/bootstrap.min.css' });
    });
    

    在模板中使用:

    <link rel="stylesheet" href="<%= cssPath %>">
    

通过以上方法,你可以确保页面中的 CSS 文件路径不会出现错误。

回到顶部