带有 Express 的 nodejs 和 ubuntu 和 rasbian 上的 EJS 不同

nodejs with express and ejs different on ubuntu and rasbian

提问人:rimi 提问时间:11/15/2023 最后编辑:rimi 更新时间:11/16/2023 访问量:32

问:

我想在 Node.js 上使用 Express 和 EJS 构建一个小日历。我从我的笔记本电脑(Ubuntu)开始,一切运行良好。
之后,我将项目克隆到我的 Raspberry 上,它将在我的家庭网络中为这个小型 Web 服务器提供服务。但是它抛出了一个错误,即使它抱怨的对象内部的“数据”也存在。

index.ejs:

<!DOCTYPE HTML>
<html>
    <head>
        <title>Little Advent Calendar</title>
        <link rel="stylesheet" type="text/css" href="/main.css"  />
    </head>
    <body class="background">
        <div class="center">
            <section >
                <h2 class="title" align="center"> <%= day %>. Dezember</h2>
                <p class="btn-style" align="center">
                    <a href="/<%= day %>" type="button" class="a-btn">Öffnen</a>
                </p>
                
            </section>
        </div>
    </body>
</html>

服务器.js(运行 Web 服务器):

...
app.use(express.static(path.join(__dirname, '/public/')));
app.set('view engine', 'ejs');
app.use(express.urlencoded({ extended: false }));
app.use(methodOverride('_method'));

app.get('/', async(req, res) => {
    let date_ob = new Date();
    let day = date_ob.getDate();
    res.render('main/index', {"day": day});
    
})

app.listen(port);

在两台计算机上,网页看起来相同。包括日期(日期)通过从服务器 .js 传递的 JSON 对象正确显示。
但是在我的 Raspberry 上,它抛出以下错误,它没有完全崩溃,但似乎那里出了点问题:

ReferenceError: /home/pi/Desktop/advent-calendar/views/main/index.ejs:10
    8|      <div class="center">
    9|          <section >
 >> 10|                 <h2 class="title" align="center"> <%= day %>. Dezember</h2>
    11|                 <p class="btn-style" align="center">
    12|                     <a href="/<%= day %>" type="button" class="a-btn">Öffnen</a>
    13|                 </p>

day is not defined
    at eval ("/home/pi/Desktop/advent-calendar/views/main/index.ejs":12:26)
    at index (/home/pi/Desktop/advent-calendar/node_modules/ejs/lib/ejs.js:703:17)

JSON在Node.js中为Raspberry和Ubuntu提供有什么区别吗?

This is how the webpage looks. It is definetly printing the day comming in the day variable from the server.js

这是网页的样子。它肯定是从服务器 .js 打印日期变量中的日期

HTML Node.js 表示 树莓派 EJS

评论

1赞 eekinci 11/15/2023
day is not defined与提供 Raspbian 和 Ubuntu 的差异无关。我想你应该把你的目录从改成。确保两个系统上的文件夹结构和区分大小写匹配。/public/app.use(express.static(path.join(__dirname, 'public')));
1赞 jQueeny 11/15/2023
如果您不将键括在引号中,您会得到错误吗?{day: day}
0赞 rimi 11/15/2023
是的,我知道错误是没有定义日期,而是页面的呈现,包括变量的值,这是正确的。因此,它被明确地填充在变量中。是的,当我不将密钥括在引号中时,我确实会遇到同样的错误。可悲的是
0赞 rimi 11/15/2023
的文件夹结构在两个系统上完全相同,因为我将其包含在 github 存储库中app.use(express.static(path.join(__dirname, 'public')));

答:

0赞 rimi 11/16/2023 #1

我在这里找到了问题。主要原因是浏览器在 Web 服务器上额外抓取 .
当这对我来说不是问题时,它确实是问题,因为我还实现了一条路由,通过添加以下内容来获取当天的当前数据:
favicon.ico

app.get('/:day', async(req, res) => {
        var dayNum = req.params.day
        var day = today();

        // decide the type and render the specific page
        if (day.type == "number" || day.type == "Number") {
            res.render('main/number', { "day": day });
        } else {
            // default page if nothing matches (fallback)
            res.render('main/index');
        }
})

插入检查是否在 url 中提供的参数而不是 favicon.ico 为我解决了它。因此,即使我还在索引页面上,浏览器也会调用此路由。

引发的错误是因为我错过了在上面的此路由中插入索引页。因此,从技术上讲,由于 favicon.ico 调用,我的索引页面被渲染了两次。第一次使用正确的值,第二次没有值。day is not defined{ day: day }