【问题标题】:How to display query results from a database in HTML using node.js如何使用 node.js 以 HTML 格式显示来自数据库的查询结果
【发布时间】:2019-08-09 06:10:02
【问题描述】:

我目前正在使用 node.js 创建一个网页,该网页对 MySQL 数据库进行查询并将结果显示在表格中。

我希望页面在初始加载时显示数据库中的所有数据,但我还想实现一个过滤器,用户可以在其中填写一些字段,当按下提交按钮时,将使用页面上显示的输入和结果。

这是我到目前为止的代码:

在“app.js”中,我与数据库建立连接并将其呈现到页面:

var connection = mysql.createConnection({
    // make connection
    host: ...,
    user: ...,
    password: ...,
    database: ...
});

connection.connect();

//routes
app.get("/", function(req, res){

    var cmd = `SELECT * FROM myTable`;
    connection.query(cmd, function(err, result, fields) {
        if (err) throw err;
        res.render('home', {result: result});
    });
});

在 home.ejs 中,我遍历结果中的每个条目以在表中创建一行:

<table>
    <tr>
        <th> ... </th>
        .
        .
        .
    </tr>
    <% result.forEach(function(entry) { %>
    <tr>
        <td><%= entry.column1 %></td>
        .
        .
        .
    </tr>
    <% }) %>
</table>

所以第一部分似乎正在工作(在初始加载时显示数据库中的所有数据),但我正在努力完成第二部分,因为我之前没有 Web 开发经验。

我目前在页面中有一个接受用户输入和一个关联的表单。但是,我不确定如何使用 myFunction() 中的用户输入对数据库执行另一个查询,以及如何用新查询的结果替换表的当前内容。

任何帮助将不胜感激!

【问题讨论】:

  • 当您说您将加载所有数据时,您的“过滤器”提交是否真的需要再次往返后端?我认为您的过滤器只会过滤客户端已经拥有的数据?您能否详细说明过滤器的作用?
  • @MatthewHarwood 实际上我从没想过这一点,但是是的,您是对的,不必进行另一个查询。我只是从初始完整结果中过滤掉不符合要求的数据。
  • 嘿,伙计,您的问题中缺少一些内容,但我认为我的方法对您有用。关于模板化客户端和过滤数据可能会有很多后续问题。这些可能更适合作为单独的 stackoverflow 问题,但留下它们,我会帮助指导你。

标签: javascript html node.js


【解决方案1】:

好的,您要做的是对视图中已有的数据进行客户端过滤。

问题是表格是在服务器端渲染的,那么在初始加载后如何在客户端改变数据?

解决方案:在渲染时将数据设置为窗口/全局字符串

<table id="results-table">
    <tr>
        <th> ... </th>
        .
        .
        .
    </tr>
    <% result.forEach(function(entry) { %>
    <tr>
        <td><%= entry.column1 %></td>
        .
        .
        .
    </tr>
    <% }) %>
</table>
<script>
  window.results = results;
</script>

之后,让我们在模板中创建一个搜索框并提交按钮:

<input type="search" id="filter-searchbar"/>
<button id="filter-submit-btn"> submit</button>

让我们添加一个事件来监听搜索和一个处理程序来过滤掉数据:

const filterSearchBar = document.querySelector('#filter-searchbar');
const filterSubmitBtn = document.querySelector('#filter-submit-btn');

filterSubmitBtn.addEventListener('click', () => {
  // Next step.
})

让我们从用户的搜索输入中过滤window.results

const filterSearchBar = document.querySelector('#filter-searchbar');
const filterSubmitBtn = document.querySelector('#filter-submit-btn');

filterSubmitBtn.addEventListener('click', () => {
  const filteredResults = window.results.filter(result => {
    // Not sure what you wanna filter by but imagine that it's by a property name.
    return result.name === filterSearchBar.value;
  });
  // Final step
});

最后一步是在表格模板的位置重新呈现该数据客户端:

const filterSearchBar = document.querySelector('#filter-searchbar');
const filterSubmitBtn = document.querySelector('#filter-submit-btn');

filterSubmitBtn.addEventListener('click', () => {
  const filteredResults = window.results.filter(result => {
    // Not sure what you wanna filter by but imagine that it's by a property name.
    return result.name === filterSearchBar.value;
  });
  const resultsTable = document.querySelector('#results-table');
  results.innerHTML = `<pre>${JSON.stringify(resultsTable)}</pre>`

});

希望您了解我使用JSON.stringify 只是为了向您展示输出已过滤。此时您需要制作自己的表格模板。

【讨论】:

  • 非常感谢您的详细回复!当我设置 window.results = result; 时,我收到一条错误消息,指出未定义结果(在 RHS 上)。你知道为什么会这样吗?
  • 我想通了!我意识到我只能访问 ejs 中的 result 变量,所以我改为使用 window.result = `&lt;% result %&gt;`
  • 只是其他一些需要考虑的事情。如果此应用程序是公开的,您必须清理发送到服务器的查询。如果不是坏演员可能会删除您的数据库。在窗口上设置数据也不是向客户端发送数据的最佳方法。最好创建一个通过 XHR 获取的 API。我会建议。显然,您可能只是在创建一个原型,而这些都不重要!祝你好运!
  • 最后一行`results.innerHTML = &lt;pre&gt;${JSON.stringify(resultsTable)}&lt;/pre&gt;`results是指app.js中渲染到页面的变量吗?我可以用 取消引用变量,但我不能在
  • 您的过滤器是否可以console.log(filteredResults) 使用,而不是使用 dom 操作客户端呈现新的表客户端
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多