Nodejs中posts is not defined,怎么解决呢?

Nodejs中posts is not defined,怎么解决呢?

错误如下: 500 ReferenceError: E:\nodejs\lianxi\microblog\views\index.ejs:1<br/> >> 1| <%if(!user){%> <br/> 2| <div class=“hero-unit”> <br/> 3| <h1>歡迎來到 Microblog</h1> <br/> 4| <p>Microblog 是一個基於 Node.js 的微博系統。</p> <br/><br/>posts is not defined

1| <%if(!user){%> 2| 3| 歡迎來到 Microblog 4| Microblog 是一個基於 Node.js 的微博系統。 posts is not defined at eval (eval at (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), :32:32) at eval (eval at (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), :35:23) at eval (eval at (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), :35:630) at E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:255:15 at Object.exports.render (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:293:13) at View.exports.renderFile [as engine] (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:323:20) at View.render (E:\nodejs\lianxi\microblog\node_modules\express\lib\view.js:76:8) at Function.app.render (E:\nodejs\lianxi\microblog\node_modules\express\lib\application.js:504:10) at ServerResponse.res.render [as partial] (E:\nodejs\lianxi\microblog\node_modules\express\lib\response.js:798:7) at ServerResponse.res.render (E:\nodejs\lianxi\microblog\node_modules\express-partials\index.js:58:9)

index.ejs代码如下: <%if(!user){%> <div class=“hero-unit”> <h1>歡迎來到 Microblog</h1> <p>Microblog 是一個基於 Node.js 的微博系統。</p> <p> <a class=“btn btn-primary btn-large” href="/login">登錄</a> <a class=“btn btn-large” href="/reg">立即註冊</a> </p> </div> <%}else{%> <%- include say %> <%}%> <%- include posts %> <div class=“row”> <div class=“span4”> <h2>Carbo 說</h2> <p>東風破早梅 向暖一枝開 氷雪無人見 春從天上來</p> </div> <div class=“span4”> <h2>BYVoid 說</h2> <p> Open Chinese Convert(OpenCC)是一個開源的中文簡繁轉換項目, 致力於製作高質量的基於統計預料的簡繁轉換詞庫。 還提供函數庫(libopencc)、命令行簡繁轉換工具、人工校對工具、詞典生成程序、 在線轉換服務及圖形用戶界面。</p> </div> <div class=“span4”> <h2>佛振 說</h2> <p>中州韻輸入法引擎 / Rime Input Method Engine 取意歷史上通行的中州韻, 願寫就一部彙集音韻學智慧的輸入法經典之作。 項目網站設在 http://code.google.com/p/rimeime/ 創造應用價值是一方面,更要堅持對好技術的追求,希望能寫出靈動而易於擴展的代碼, 使其成為一款個性十足的開源輸入法。</p> </div> </div>


10 回复

Nodejs 中 posts is not defined 错误如何解决?

错误描述

在运行 Node.js 应用时遇到以下错误:

ReferenceError: E:\nodejs\lianxi\microblog\views\index.ejs:1
>> 1| <%if(!user){%>
 2| <div class="hero-unit">
 3| <h1>歡迎來到 Microblog</h1>
 4| <p>Microblog 是一個基於 Node.js 的微博系統。</p>

posts is not defined
    at eval (eval at (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), :32:32)
    ...

问题分析

错误提示 posts is not defined 表明在 EJS 模板文件 index.ejs 中引用了一个未定义的变量 posts

解决方案

  1. 确保数据传递给模板 确保在渲染模板时将 posts 数据传递给 EJS 模板。假设你在 Express 中渲染模板,可以在路由处理函数中添加 posts 数据。

    const express = require('express');
    const app = express();
    
    // 假设你有一个获取所有帖子的函数
    function getPosts() {
        return [
            { id: 1, content: '东' },
            { id: 2, content: '西' },
            { id: 3, content: '南' },
            { id: 4, content: '北' }
        ];
    }
    
    app.get('/', (req, res) => {
        const user = req.session.user; // 假设你已经设置了 session 用户信息
        const posts = getPosts(); // 获取帖子数据
        res.render('index', { user, posts });
    });
    
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    
  2. 修改 EJS 模板index.ejs 文件中正确使用 posts 变量。例如,你可以遍历 posts 并显示它们的内容。

    <% if (!user) { %>
        <div class="hero-unit">
            <h1>歡迎來到 Microblog</h1>
            <p>Microblog 是一個基於 Node.js 的微博系統。</p>
            <p>
                <a class="btn btn-primary btn-large" href="/login">登錄</a>
                <a class="btn btn-large" href="/reg">立即註冊</a>
            </p>
        </div>
    <% } else { %>
        <% - include say %>
    <% } %>
    
    <% - include posts %>
    
    <div class="row">
        <% for (let post of posts) { %>
            <div class="span4">
                <h2>Post by <%= post.id %></h2>
                <p><%= post.content %></p>
            </div>
        <% } %>
    </div>
    

通过上述步骤,你可以确保 posts 数据被正确地传递到 EJS 模板,并且在模板中正确地引用该变量。这样可以避免 ReferenceError 错误。


首先看下res.render(‘login’,{ posts:posts });有木有?其次看下渲染页面上有没有写错

有这个代码,渲染页面就是上面那个index.ejs app.get(’/’,function(req,res){ Post.get(null,function(err,posts){ if(err){ posts=[]; } res.render(‘index’,{ title:‘首页’, posts:posts, }); }); });

你觉得是哪里的问题呢?

nodejs的这种报错不一定是posts undefined 而是你页面中存在其他问题 比如说 JS没加载 或者模板渲染出错等。他都会报这个问题

这个后来不知怎么的就好了。谢谢你啊

ReferenceError: E:\nodejs\lianxi\microblog\views\index.ejs:3 1| <link href="/stylesheets/bootstrap.css" rel=“stylesheet”> 2| <link href="/stylesheets/bootstrap-responsive.css" rel=“stylesheet”>

3| <script src="/javascripts/jquery.js"></script> 4| <script src="/javascripts/bootstrap.js"></script> 5| <br/><br/> 6| <%include header.ejs%>

posts is not defined at buf.push. .buf.push. . <div align=“center”>.buf (eval at <anonymous> (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242 :14), <anonymous>:39:160) at buf.push. . <div align=“center”>.buf (eval at <anonymous> (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242 :14), <anonymous>:41:23) at eval (eval at <anonymous> (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), <anonym ous>:44:23) at eval (eval at <anonymous> (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:242:14), <anonym ous>:46:45) at E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:255:15 at Object.exports.render (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:293:13) at View.exports.renderFile [as engine] (E:\nodejs\lianxi\microblog\node_modules\ejs\lib\ejs.js:323:20 ) at View.render (E:\nodejs\lianxi\microblog\node_modules\express\lib\view.js:76:8) at Function.app.render (E:\nodejs\lianxi\microblog\node_modules\express\lib\application.js:504:10) at ServerResponse.res.render (E:\nodejs\lianxi\microblog\node_modules\express\lib\response.js:798:7) 又出问题了,不过那个posts我的确定义了,而且在其他的ejs里面好着,但是就是放到index.ejs里面不行,我就不懂了。。。他这个指向那个js,不知道什么情况?你有遇到过吗?

可能是没数据。。。也可能在哪里被重置了。。。基础知识啊。。。

终于解决了,这个原因是因为在index.js里面需要将posts:posts放进那个render()里面,这样才能够在后面的ejs里面调用。之前没有注意这个问题,昨天忽然想明白了。。。

在你的 index.ejs 文件中,你尝试包含了 posts 这个变量,但该变量未在你的代码中定义或传递给视图。你需要确保在渲染视图时将 posts 数据传递给模板。

示例代码

假设你在使用 Express 框架,你可以这样修改你的路由处理函数:

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

// 假设你有一个获取文章列表的函数
function getPosts(callback) {
    // 这里是获取数据的实际逻辑
    const posts = [
        { title: '文章1', content: '这是文章1的内容' },
        { title: '文章2', content: '这是文章2的内容' }
    ];
    callback(posts);
}

app.get('/', (req, res) => {
    if (!req.user) {
        res.render('index', { user: null });
    } else {
        getPosts((posts) => {
            res.render('index', { user: req.user, posts: posts });
        });
    }
});

app.listen(3000, () => {
    console.log('App listening on port 3000!');
});

解释

  1. getPosts 函数:这是一个模拟的数据获取函数,它会返回一些示例数据。在实际应用中,这可能是一个数据库查询或其他异步操作。

  2. 路由处理函数:在路由处理函数中,首先检查用户是否已登录 (!req.user)。如果用户未登录,则只传递 user 参数给视图;如果用户已登录,则调用 getPosts 函数来获取文章列表,并将 userposts 都传递给视图。

  3. 视图渲染:在 index.ejs 中,你可以通过 <%- include posts %> 来包含文章列表数据。

index.ejs 修改

<% if (!user) { %>
<div class="hero-unit">
    <h1>歡迎來到 Microblog</h1>
    <p>Microblog 是一個基於 Node.js 的微博系統。</p>
    <p>
        <a class="btn btn-primary btn-large" href="/login">登錄</a>
        <a class="btn btn-large" href="/reg">立即註冊</a>
    </p>
</div>
<% } else { %>
<%- include say %>
<% } %>

<% if (posts && posts.length > 0) { %>
<h2>最新文章</h2>
<ul>
    <% for (let post of posts) { %>
    <li><%= post.title %> - <%= post.content %></li>
    <% } %>
</ul>
<% } %>

<div class="row">
    <div class="span4">
        <h2>Carbo 說</h2>
        <p>東風破早梅 向暖一枝開 氷雪無人見 春從天上來</p>
    </div>
    <div class="span4">
        <h2>BYVoid 說</h2>
        <p>
            Open Chinese Convert(OpenCC)是一個開源的中文簡繁轉換項目,
            致力於製作高質量的基於統計預料的簡繁轉換詞庫。
            還提供函數庫(libopencc)、命令行簡繁轉換工具、人工校對工具、詞典生成程序、
            在線轉換服務及圖形用戶界面。
        </p>
    </div>
    <div class="span4">
        <h2>佛振 說</h2>
        <p>
            中州韻輸入法引擎 / Rime Input Method Engine 取意歷史上通行的中州韻,
            戀寫就一部彙集音韻學智慧的輸入法經典之作。
            項目網站設在 <a href="http://code.google.com/p/rimeime/">http://code.google.com/p/rimeime/</a>
            創造應用價值是一方面,更要堅持對好技術的追求,希望能寫出靈動而易於擴展的代碼,
            使其成為一款個性十足的開源輸入法。
        </p>
    </div>
</div>

这样,当你访问首页时,如果用户已登录,页面会显示文章列表;否则,仅显示欢迎信息。

回到顶部