使用 partial 找不到指定目录, 怎么会加载到 \null 目录 Nodejs 问题

使用 partial 找不到指定目录, 怎么会加载到 \null 目录 Nodejs 问题

Error: D:\WebstormProjects\K-blog_bate\views\topic\index.html:36 34| </ul> 35| <% if (topic.replies || topic.replies.length > 0) { %>

36| <%- partial(‘reply/reply’, { collection: topic.replies, as: ‘replies’ }) %> 37| <% } else { %> 38| <div class=“pro_detail”> 39| <p>目前尚无回复.</p>

ENOENT, no such file or directory 'D:\WebstormProjects\K-blog_bate\null’ at Object.fs.openSync (fs.js:338:18) at Object.fs.readFileSync (fs.js:182:15)


3 回复

使用 partial 找不到指定目录, 怎么会加载到 \null 目录 Nodejs 问题

问题描述

在使用 partial 渲染模板时,如果指定的路径不存在,可能会导致错误信息中出现 \null 目录。例如,在尝试渲染一个 reply/reply 模板时,如果路径错误或模板不存在,Node.js 可能会默认加载到 \null 目录,从而报错。

示例代码

假设你有一个 Express 应用,并且使用 EJS 作为模板引擎。以下是可能引发该问题的代码示例:

// app.js
const express = require('express');
const ejs = require('ejs');

const app = express();
app.set('views', './views'); // 设置视图文件夹路径
app.set('view engine', 'ejs'); // 设置模板引擎为 EJS

app.get('/topic/:id', (req, res) => {
    const topic = {
        replies: [
            { content: 'Reply 1' },
            { content: 'Reply 2' }
        ]
    };
    res.render('topic/index', { topic });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

对应的模板文件 topic/index.ejs 如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Topic</title>
</head>
<body>
    <ul>
        <% if (topic.replies && topic.replies.length > 0) { %>
            <!-- 错误的 partial 路径 -->
            <%= partial('reply/reply', { collection: topic.replies, as: 'replies' }) %>
        <% } else { %>
            <div class="pro_detail">
                <p>目前尚无回复.</p>
            </div>
        <% } %>
    </ul>
</body>
</html>

问题分析

在上述代码中,如果 reply/reply.ejs 文件不存在或者路径有误,EJS 在尝试渲染 reply/reply.ejs 时会抛出错误。错误信息显示为 ENOENT, no such file or directory 'D:\WebstormProjects\K-blog_bate\null’,这表明 EJS 尝试加载了一个不存在的路径,最终默认加载到了 \null 目录。

解决方案

  1. 检查路径:确保 reply/reply.ejs 文件存在于正确的路径下。
  2. 调试输出:添加一些调试输出以确认路径是否正确。
  3. 错误处理:在渲染时增加错误处理逻辑,确保不会因为路径错误导致整个应用崩溃。

示例代码中的解决方案:

// app.js
const express = require('express');
const ejs = require('ejs');

const app = express();
app.set('views', './views'); // 设置视图文件夹路径
app.set('view engine', 'ejs'); // 设置模板引擎为 EJS

app.get('/topic/:id', (req, res) => {
    const topic = {
        replies: [
            { content: 'Reply 1' },
            { content: 'Reply 2' }
        ]
    };

    try {
        res.render('topic/index', { topic });
    } catch (error) {
        console.error(error);
        res.status(500).send('Rendering error occurred.');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

通过以上步骤,可以避免由于路径错误导致的 \null 目录加载问题。


改用这种方法后就OK了

<% topic.replies.forEach(function(replie){  %>
   <% include ../reply/reply.html %>
<% }) %>

根据你的描述,错误信息表明在使用 partial 函数时,它尝试加载一个不存在的路径 'D:\WebstormProjects\K-blog_bate\null'。这通常意味着 partial 的路径参数可能被误传或计算错误。

解决方案

确保你传递给 partial 的路径是正确的,并且正确设置了模板引擎中的部分文件路径。假设你正在使用 ejs 模板引擎,下面是一些检查点和可能的解决方案:

1. 确认模板引擎配置

首先,确认你在初始化模板引擎时是否正确设置了部分路径。例如,如果你使用的是 ejs,确保你已经正确配置了部分路径:

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

const app = express();

app.set('views', './views'); // 设置视图文件夹路径
app.set('view engine', 'ejs'); 

// 如果需要的话,可以设置部分路径
app.engine('html', ejs.renderFile);

2. 检查 partial 调用

确保你在调用 partial 时传入的路径是正确的:

<%- partial('reply/reply', { collection: topic.replies, as: 'replies' }) %>

确保 reply/reply 文件确实存在于 ./views/reply/reply.ejs

3. 示例目录结构

假设你的项目目录结构如下:

K-blog_bate/
├── views/
│   ├── topic/
│   │   └── index.html
│   └── reply/
│       └── reply.ejs

确保路径是相对于 views 文件夹的。

4. 检查文件名大小写

在某些操作系统中(如 Linux),文件名大小写敏感。确保路径中的大小写与实际文件名一致。

通过这些步骤,你应该能够解决 partial 加载错误路径的问题。如果问题仍然存在,请检查是否有其他地方错误地更改了路径,或者是否有拼写错误。

回到顶部