【问题标题】:ReferenceError when trying to use a variable in an EJS template file尝试在 EJS 模板文件中使用变量时出现 ReferenceError
【发布时间】:2023-01-12 05:50:10
【问题描述】:

我遇到了很多麻烦,只是试图让 EJS 模板文件识别一个变量,该变量将 SQLite3 表查询的行存储在相应的 .js 文件中。启动服务器并尝试访问该路由时,我在 EJS 文件中使用的变量出现 ReferenceError。

对于上下文,它是一个微型博客项目,我希望作者能够将文章草稿保存到数据库中,并且用户能够稍后回来修改或发布它们。

这是我的“author.js”文件:

// Author Page
const express = require("express");
const router = express.Router();
const assert = require('assert');

/**
 * @desc retrieves draft articles
 */
router.get("/author-home", (req, res, next) => {

    //Use this pattern to retrieve data
    //NB. it's better NOT to use arrow functions for callbacks with this library
    global.db.all("SELECT * FROM draftArticles", function (err, rows) {
      if (err) {
        next(err); //send the error on to the error handler
      } else {
        res.json(rows);
      }
    });
});


/**
 * @desc Renders the author page
 */
router.get("/author", (req, res) => {
    res.render("author-home", data);
  });


module.exports = router;

在我的“author-home.ejs”文件中,我试图在一个元素中插入各种文章属性,如下所示:

<td><% data[0].article_title %> </td>
<td><% data[0].article_subtitle %> </td>

...ETC。

谁能告诉我我做错了什么?如果有帮助,我还可以发布我的“index.js”文件的代码。提前谢谢了

编辑:

在发送了一些建议并突出显示“数据”变量的范围问题后,我将 author.js 中的代码更正(至少,我相信如此)如下:

    // Author Page
const express = require("express");
const router = express.Router();
const assert = require('assert');





router.get('/author-home', (req, res, next) => {
    global.db.all('SELECT * FROM draftArticles', function (err, rows) {
      if (err) {
        console.log("No data found.")
        next(err); //send the error on to the error handler
        return;
      }
  
      res.render('author-home', { data: rows });
    });
});



module.exports = router;

但是,当我尝试访问我的 EJS 文件中的 data 时,我仍然收到 referenceError

正如建议的那样,我也尝试像这样传递静态数据:

let dummyData = "This is test data";

router.get('/author-home', (req, res, next) => {
    res.render('author-home', { data: dummyData });
});

还收到referenceError

【问题讨论】:

  • 您是否尝试过在数据变量中设置静态数据并传递给模板?可能是数据的问题。
  • res.render("author-home", data); 中的 data 变量未定义。或者至少我看不到您在哪里定义它并为其分配任何值。
  • 谢谢@Molda,我已经更正了这一点。不幸的是,在我的 author-home.ejs 文件中尝试访问 data 时,我仍然收到 referenceError

标签: html node.js express ejs


【解决方案1】:

这是因为你没有定义“数据”。如果你想发送一个你可以使用的数组,你需要定义它 How can I pass an array to an ejs template in express?

【讨论】:

  • 您好,感谢您的回复 - 我关注了您发送给我的线程中的所有更改,但不幸的是,我仍然收到 ReferenceError
【解决方案2】:

尝试更改您的 /author-home 端点并从那里呈现数据:

router.get('/author-home', (req, res, next) => {
  global.db.all('SELECT * FROM draftArticles', function (err, rows) {
    if (err) {
      next(err); //send the error on to the error handler
      return;
    }

    res.render('author-home', { data: rows });
  });
});

【讨论】:

  • 谢谢,我遵循了这个,因为其他回答是正确的,因为存在范围问题;数据未在 author.js 中定义,至少在我调用 res.render("author-home", data) 的范围内是这样;但是,即使用您的更正替换该代码,我仍然会得到相同的 referenceError。我想知道是什么原因导致 EJS 模板看不到我在 author.js 中传递给它的变量
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多