【问题标题】:How to pass an object from EJS to Node.js Router - Javascript, EJS, Node.js, MySQL如何将对象从 EJS 传递到 Node.js 路由器 - Javascript、EJS、Node.js、MySQL
【发布时间】:2018-09-07 20:36:03
【问题描述】:

我正在循环遍历 MySQL 表中的记录,将它们显示在 EJS 文件中,并在单击时路由到页面以编辑记录。但是,我无法将单个对象传递回我的 routes.js 文件以将其路由到编辑页面。我循环浏览所有记录并打印它们没有问题,所以我知道数据在那里。这是 EJS 文件的一部分,我在其中输出所有记录以供用户选择:

<body>
<div class="container">

<div class="col-sm-6 col-sm-offset-3">

    <h1><span class="fa fa-chess"></span> View Roommate Agreements</h1><br>
    <p align="center">Click on a Roommate Agreement below to view the full response and edit if necessary.</p><br>

    <% for (var i=0; i < Agreements.length; i++) { %>
        <a href="/editAgreement" style="text-decoration: none; color: #333333">
            <div class="well" align="center">

                <h3>Roommate Agreement for Room #<%= Agreements[i].roomNumber%></h3>
                <p><%= Agreements[i].roommate1%></p>
                <p><%= Agreements[i].roommate2%></p>
                <% var Agreement = Agreements[i]%> //THIS is where I'm trying to declare the object
            </div>
        </a>
    <% } %>

    <hr>
    <p align="center">
        <a href="/agreement" class="btn btn-default btn-sm"><span class="fa fa-arrow-circle-left"></span> Back</a>
        <a href="/logout" class="btn btn-default btn-sm"><span class="fa fa-sign-out-alt"></span> Logout</a>
    </p>

</div>

</div>
</body>

这里是将对象路由到编辑页面的 Get 函数。您可以看到我尝试将对象记录到控制台的位置,以确保获得正确的信息,但它当前打印为“未定义”。

app.get('/editAgreement', isLoggedIn, function(req, res) {
    res.render('editAgreement.ejs', {
        Employee: req.user
    })
    console.log(req.body.Agreement);
})

我不确定问题是我如何在 EJS 中声明对象变量,或者我如何尝试在 Get 函数中使用它,因为我是 Javascript 新手。任何提示或帮助将不胜感激,谢谢! :)

【问题讨论】:

  • 您是否尝试为每个协议创建唯一链接? (其中包含一些额外的数据,比如室友的名字作为上下文?)
  • Blake,要访问模板中的Agreements 变量,您需要先从render 调用中传入它,就像传入Employee 一样。
  • 请在客户端发布你的get函数
  • @StephenGheysens 单击特定协议后,我希望它重定向到用户可以编辑它的页面。我知道我需要从render 调用中传递它,但我仍在努力在那里获取数据。 console.log 函数当前在控制台中打印 undefined,如果数据被正确传递,则不会。
  • @ShimonBrandsdorfer 我不太清楚你的意思。你能澄清一下吗?

标签: javascript mysql node.js express ejs


【解决方案1】:

要使用GET 将变量传递到另一个页面,您必须在url 中传递它们,这样您将暴露您的数据,如果您有很多信息要传递,这是不安全的,而且工作量很大,您应该只将协议的id 传递给get 路由,获取协议然后渲染视图,例如:

<% for (var i=0; i < Agreements.length; i++) { %>
    <a href="/editAgreement/<%= Agreements[i].id %>" style="text ...

然后:

app.get('/editAgreement/:id', isLoggedIn, function(req, res) {
    let agreementId = req.params.id;

    let agreement = // go fetch the agreement from the database like you did before with the list of agreements

    res.render('editAgreement.ejs', agreement)
})

【讨论】:

  • 感谢您的回答!这听起来很有希望,但我认为我仍然缺少一些东西。这是我现在的get 路线:app.get('/editAgreement/:agreementID', isLoggedIn, function(req, res) { let agreementID = req.params.agreementID; var query = ("SELECT * FROM RoommateAgreement WHERE agreementID = ?"); connection.query(query, agreementID, function(err, rows, fields){ res.render('editAgreement.ejs', { Employee: req.user, Agreement: rows }); }); });
  • 这就是我在 EJS 中的内容:&lt;% for (var i=0; i &lt; Agreements.length; i++) { %&gt; &lt;a href="/editAgreement/&lt;% Agreements[i].agreementID %&gt;" style= 不幸的是,我收到了 Cannot GET /editAgreement 错误。如果这些 cmets 令人困惑,请让我知道,因为代码看起来很混乱。谢谢!
  • 不客气 :) ,您的代码看起来不错,只需决定是使用 var 还是 let (google that :P),我认为您只需要重新启动节点服务器并使用 ctrl+F5 刷新页面,检查链接以确保您有 /editAgreement/5html 中的某个 id
  • 我认为 EJS 文件没有正确构建链接。它不是将 ID 添加到末尾。
  • 哦,对不起,我的错,应该是&lt;%= Agreement... %&gt;,我忘了=
【解决方案2】:

如果您想将 Object 与您的 GET 请求一起发送,您需要将它们一起发送,而您的代码似乎并没有这样做。

最快的解决方案是使用querystring 模块。通过在你的代码顶部请求它,然后用它来发送协议对象,如下:

<% 

 const querystring = require('querystring');
 for (var i=0; i < Agreements.length; i++) { 
       var Agreement = Agreements[i]
 %>
        <a href="/editAgreement/?<%= querystring.stringify(Agreement) %>" style="text-decoration: none; color: #333333">
            <div class="well" align="center">

                <h3>Roommate Agreement for Room #<%= Agreement.roomNumber%></h3>
                <p><%= Agreement.roommate1%></p>
                <p><%= Agreement.roommate2%></p>
            </div>
        </a>
    <% } %>

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2020-04-26
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多