尽管正确链接 HTML,但未定义错误

Posted

技术标签:

【中文标题】尽管正确链接 HTML,但未定义错误【英文标题】:Undefined error despite linking HTML correctly 【发布时间】:2020-11-06 21:21:33 【问题描述】:

我已将路由链接到 html,但 html 一直显示 agentData 未定义。为什么它给我这个错误 尽管正确链接它。 app.js 代码是我链接登录和管理路由的地方。 Routes是登录的地方 根据用户名和密码控制用户的去向。一旦他们登录到 routes.js 然后我会呈现 html 页面 admin.js,是它从 mysql 数据库中获取所有数据并输出为表的地方。如您所见,我确实声明了 agentData 在 admin.js 中。但是,如果我在 routes.js 中删除 app.get/admin,他们会给我另一个错误,不能 /Get admin 错误。什么 我应该怎么做?

routes.js


const express = require('express');
const router = express.Router();
const db = require('../server');

router.get("/",  async function (request, response) 
    response.render("login.ejs");
  );

  router.get("/register", async function (req, res) 
    res.render("register.ejs");
  );

  router.post("/login", async function (request, response) 
    const  username, password  = request.body;

    if (username == 2 && password == 2) 
      response.redirect("/admin");
     

    else 
      return response.status(401).json(
        message: "Auth fail",
      );
    
  );

  router.get('/admin', function(req, res, next) 
    console.log('reach page');
    const sql='SELECT * FROM agentavia';
    db.query(sql, function (err, data, fields) 
      console.log(data);
    if (err) throw err;
    res.render('adminhome',  title: 'Agent List', agentData: data);
  );
  );
  
  router.get('/edit/:id', function(req, res, next) 
    const AgentId= req.params.id;
    const sql=`SELECT * FROM agentavia WHERE id=$AgentId`;
    db.query(sql, function (err, data) 
      if (err) throw err;
      res.render('modifyAgent',  title: 'Agent List', editData: data[0]);
    );
  );
  
  router.post('/edit/:id', function(req, res, next) 
    const id= req.params.id;
      const updateData=req.body;
      const sql = `UPDATE agentavia SET ? WHERE id= ?`;
      db.query(sql, [updateData, id], function (err, data) 
      if (err) throw err;
      console.log(data.affectedRows + " record(s) updated");
    );
    res.redirect('/admin');
  );
  
  module.exports = router;

adminhome.ejs

    <table border="1">
        <tr>
            <th>S.N</th>
            <th>Agent Name</th>
            <th>Agent ID</th>
            <th>AgentStatus</th>
            <th>Edit</th>
        </tr>

        <% if(agentData.length!=0) var i=1; agentData.forEach(function(data) %>
        <tr>
            <td><%=i; %></td>
            <td><%=data.agentName %></td>
            <td><%=data.agentID %></td>
            <td><%=data.agentStatus %></td>
            <td><a href="/admin/edit/<%=data.id%>">Edit</a></td>
        </tr>
        <% i++; ) %> <%  else %>
        <tr>
            <td colspan="7">No Data Found</td>
        </tr>
        <%  %>
    </table>

修改agent.ejs

<div class="agent-detail">
   
    <form action="<%=(typeof editData!='undefined')?'/admin/edit/'+editData.id:'/admin/create'%>" method="POST">
          <label>Agent Name</label>
          <input type="agentname" placeholder="Enter Agent Name" name="agentName" required value="<%=(typeof editData!='undefined')? editData.agentName:''%>">
          <label>Agent ID</label>
          <input type="agentID" placeholder="Enter Agent ID" name="agentID" required value="<%=(typeof editData!='undefined')? editData.agentID:''%>">
          <label>Agent Status</label>
          <input type="Agent Status" placeholder="Enter Agent Status" name="agentStatus" required value="<%=(typeof editData!='undefined')? editData.agentStatus:''%>">
          <button type="submit">Submit</button>
        </div>
  </div>

【问题讨论】:

你能检查一下这条记录是否在表 SELECT * FROM agentavia 中? 您的routes.js 文件中不应有另一个app.get(... 中的app.get(...。这不是它的工作方式,这意味着如果您重新启动服务器,已经登录的人将无法访问/admin。另外,既然你在admin.js 中正确定义了它,为什么还要在那里?您不能在多个地方定义它。正如@VijayPalaskar 所建议的那样,尝试console.log(data) 正上方res.render('adminhome', title... 以查看该数据是否存在 是的,我确实有里面的记录。我什至设法让它在另一个文件夹中工作,所以我将它一点一点地转移到我在这里展示的原始项目文件夹中。至于 app.get 部分,当我从其他示例中看到时,实际上有一个现有示例,它工作得很好。那么使用 router 而不是 app.get 会更好吗? 是路由器而不是 app.get。我认为你的文件扩展名有问题。你能检查一下它是否适用于 ..ejs 扩展名? 我已经尝试在渲染页面之前放置console.log。它没有提供任何数据... 【参考方案1】:

1.文件扩展名中的问题。它应该是 adminhome.ejs 而不是 adminhome.html

或者另一种方法是使用包含

关于如何使用包含请参阅此Ejs engine with html not working

这个例子我在本地测试过。它工作正常

app.js

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

    // set the view engine to ejs
    app.set('view engine', 'ejs');

    // index page 
    app.get('/', function (req, res) 
        var data = [
             id: 1,agentName: 'Bloody Mary', agentID: 3,agentStatus: 'yes' ,
             id:2,agentName: 'Martini', agentID: 5 ,agentStatus: 'no',
             id:3,agentName: 'Scotch', agentID: 10 ,agentStatus: 'yes'
        ];


        res.render('index', 
            agentData: data
        );
    );

    app.listen(3000, () => console.log('listening at 3000'));

索引.ejs

    <h2>Loop</h2>

    <table border="1">
        <tr>
          <th>S.N</th>
          <th>Agent Name</th>
          <th>Agent ID</th>
          <th>AgentStatus</th>
          <th>Edit</th>
        </tr>
      
        <% if(agentData.length!=0) var i=1; agentData.forEach(function(data) %>
        <tr>
          <td><%=i; %></td>
          <td><%=data.agentName %></td>
          <td><%=data.agentID %></td>
          <td><%=data.agentStatus %></td>
          <td><a href="/agents/edit/<%=data.id%>">Edit</a></td>
        </tr>
        <% i++; ) %> <%  else %>
        <tr>
          <td colspan="7">No Data Found</td>
        </tr>
        <%  %>
      </table>

Ejs 参考:https://www.npmjs.com/package/ejs

【讨论】:

感谢您的帮助,但我仍然收到相同的错误 agentData is not defined 尽管将所有 app.get 更改为 router.get。我还将 adminhome.html 更改为 adminhome.ejs。我应该用最新的代码更新问题吗? 看到我已经更新了我的答案。我在本地服务器上测试过。它工作正常 如果身份验证失败并传递错误消息,您可以重定向到登录,如果成功则重定向到仪表板页面。我建议你不要使用 ejs。使用任何前端技术 react,angular,vue js Cannot GET /admin/edit/1 this message正在显示或另一条消息显示? 显示此消息是因为您尚未定义任何路线。它将与 /edit/1 一起工作到 /admin/edit/1 必须工作你需要像这样定义路由或 app.use('/admin',load path of route file) ..all url of this route js文件从 /admin 路径开始。另一种方法是 router.get('admin/edit/:id',() => ) 但这不是更好的方法。它会起作用的更多信息:expressjs.com/en/guide/routing.html

以上是关于尽管正确链接 HTML,但未定义错误的主要内容,如果未能解决你的问题,请参考以下文章

Electron - 尽管 nodeIntegration 为真,但未定义要求

C:尽管添加了 `-ldl` 标志,但未定义对 `dlopen`/`dlsym` 的引用

尽管存在索引,但未定义的索引仍然存在

静态模板成员变量具有内部链接但未定义

尽管静态链接,但未找到 DLL

TypeError:预期的喉咙大小是一个数字,但未定义