node.js + mysql + ejs 数据插入后无需重新加载页面即可更新屏幕信息

Posted

技术标签:

【中文标题】node.js + mysql + ejs 数据插入后无需重新加载页面即可更新屏幕信息【英文标题】:node.js + mysql + ejs update screen information without reloading page after data insert 【发布时间】:2020-05-20 20:25:02 【问题描述】:

我正在尝试在插入后更新我的任务列表,当前当我按下按钮时,在我的 ejs 页面中我提交了一个发布请求,而不是在我的控制器中我有 app.post("/mypage") 和这里我使用 connection.query() 进行插入,然后我使用 res.redirect() 重新加载页面,所以我的 app.get("/myPage") 重新加载我的所有数据并将其显示在我的页面上,是否存在一种无需重新加载的方法吗?我正在考虑使用 jQuery Ajax,但找不到足够的信息来源。

ejs 模态添加

<div class="modal" id="addTask">
      <div class="modal-content">
        <form action="/studentDashTaskAdd/<%=uID%>/<%=pID%>" method="post">
          <div class="row">
            <div class="input-field col s12">
              <input
                id="task_title"
                name="taskTitle"
                type="text"
                class="validate"
              />
              <label for="task_title">Title</label>
            </div>
          </div>
          <div class="row">
            <div class="input-field col s12">
              <textarea
                id="textarea1"
                name="taskDescription"
                class="materialize-textarea"
              ></textarea>
              <label for="textarea1">Description</label>
            </div>
          </div>

          <div class="row">
            <div class="input-field col s12">
              <input
                type="text"
                id="taskDeadine"
                name="taskDeadline"
                class="datepicker"
              />
              <label for="taskDeadine">Deadline</label>
            </div>
          </div>
          <div class="row">
            <div class="input-field col s12">
              <select id="priority" name="taskPriority">
                <option value="1">Low</option>
                <option value="2">medium</option>
                <option value="3">High</option>
              </select>
              <label for="priority">Priority</label>
            </div>
          </div>
          <button type="submit" name="submidTask" class="btn blue right">
            Submit <i class="material-icons right">send</i>
          </button>
        </form>
      </div>
      <div class="modal-footer"></div>
    </div>
//adding task from student dash
  app.post(
    "/studentDashTaskAdd/:userID/:projectID",
    parsed,
    (req, res, next) => 
      //console.log(req.body);
      connection.query(
        "INSERT INTO task(priority,description,deadline,title,userID,projectID) values('" +
          req.body.taskPriority +
          "','" +
          req.body.taskDescription +
          "','" +
          req.body.taskDeadline +
          "','" +
          req.body.taskTitle +
          "','" +
          req.params.userID +
          "','" +
          req.params.projectID +
          "');"
      );
      //console.log(req.params.userID);

      res.redirect(
        "/studentDash/" + req.params.userID + "/" + req.params.projectID
      );
    
  );

【问题讨论】:

【参考方案1】:

我最近开始使用你的工具组合,所以我不确定我是否给你提供了最佳的方法,但我会用 jquery 这样做:

jQuery

$.post(
    "studentDashTaskAdd",
    yourValues,
    (data, status) => 
    

            switch(status)
                case "error":
            // Manage your issues here
                    return;
                case "timeout":
            // Manage your issues here
                    return;
                case "parsererror":
            // Manage your issues here
                    return;
            
        // then either you send back the full list and treat it here or just append what you just sent to your server
    ,
    "json"
    )

NodeJS

app.post(
    "/studentDashTaskAdd",(req,res) = >
        const query = " your query"; //req.body still works in this case for your params
        connection.query(query,(err,results) => 
            if(err)
                res.status(400).send(message:err);
            
            res.send("your data as json or anything to tell your ajax Ok It's done");
        )
);

如果我错了,如果有人纠正我,我会很高兴我还在学习:P

附: : 你也可以像 id="addTask" 给你的按钮添加一个 id 然后使用$("#addTask").click( () =&gt; //what i've done above)

【讨论】:

"PS : 你也可以像 id="addTask" 一样给你的按钮添加一个 id 然后使用 $("#addTask").click( () => //what i'上面已经完成)" 这就是我正在做的事情,但是在哪里写你的 jquery?我目前正在 ejs 文件中执行此操作,因为如果我尝试将代码放入静态文件中,它无法识别数据并引发错误 我猜您正在尝试使用已发送到 EJS 页面但未在任何地方打印的数据,而您将其打印在脚本标签中?一种解决方法是隐藏带有数据或值的html标签。 &lt;div id="test" data-nameOfYourValue="data" hidden&gt;&lt;/div&gt; 在 jquery 中你可以像这样访问它$("#test").attr("data-nameOfYourValue")

以上是关于node.js + mysql + ejs 数据插入后无需重新加载页面即可更新屏幕信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 和 Express 上的同一个 .ejs 文件上呈现 MySQL 查询的多个结果?

Node.js - 将多个对象传递给同一个 EJS 文件

使用 ejs 组件将数据从 js 发送到 html

如何在编写变量 ejs、node.js 时禁用默认修剪?

从前端将数据发送回 node.js 服务器

node.js ejs模板引擎将后端数据赋值给前端js