【问题标题】:How to pass name or ID of a button to Node using fetch如何使用 fetch 将按钮的名称或 ID 传递给 Node
【发布时间】:2020-02-12 13:22:11
【问题描述】:

我有一个表,其中填充了数据库中的项目,我希望在每一行中都有一个按钮,用于从数据库中删除该项目。我的方法是为按钮提供与将要删除的特定数据相同的 ID/名称,但我不知道如何将该 ID 传递给节点,以便它知道要删除的确切项目。我在 js 中使用 fetch 来使用该按钮进行 POST。

我使用 node 和 express,我使用 ejs 作为我的模板解决方案。我的数据库是 mongodb 和 mongoose。

这是一个按钮,它是为数据库中的每个项目生成的,它与数据库中的项目具有相同的 id。

<button class="delete-button" id='<%= item._id %>'>X</button>

这是获取。整个事情都在 forEach 中为每个按钮添加监听器

button.addEventListener('click', () => {
    fetch('/delete', { method: 'POST' })
      .then(function (response) {
        if (response.ok) {
          console.log('Delete was recorded')
          return
        }
        throw new Error('Request failed.')
      })
      .catch(function (error) {
        console.log(error)
      })
  })

这是节点中的 app.post。

app.post('/delete', (req,res)=>{
    console.log("Deleted button has been clicked")
})

这很好用,但我不知道如何将 id 传递给节点。

提前谢谢你

【问题讨论】:

    标签: javascript html node.js express ejs


    【解决方案1】:

    在 ejs 文件中: 这进入了 forEach 循环

    <form class="pull-right" action="/item/<%= item._id %>?_method=DELETE" method="POST">
        <input type="submit" class="btn btn-xs btn-danger" value="Delete">
    </form>
    

    (需要安装method-override库:npm install method-override --save)

    这里是服务器端:

    var express = require("express"),
        app = express(),
        bodyParser = require("body-parser"),
        mongoose = require("mongoose"),
        methodOverride = require("method-override");
    
    app.use(methodOverride("_method"));
    
    app.delete("/item/:id", function(req, res){
        <item list in MongoDB>.findByIdAndRemove(req.params.id, function(err){
            if(err){
                res.send(err);
            }else{
                res.redirect("/<index(ejs) page>");
            }
        });
    });
    

    【讨论】:

      【解决方案2】:

      您需要在 javascript 代码中将 id 添加到删除 url,如下所示: (我还将方法 POST 更改为 DELETE,因为遵循休息约定很好)

      button.addEventListener('click', () => {
          fetch('/delete/'+this.id, { method: 'DELETE' })
            .then(function (response) {
              if (response.ok) {
                console.log('Delete was recorded')
                return
              }
              throw new Error('Request failed.')
            })
            .catch(function (error) {
              console.log(error)
            })
        })
      
      

      要在 api 端获取 id,您可以使用 req.params.id

      app.delete('/delete/:id', (req,res)=>{
          console.log(req.params.id);
          console.log("Deleted button has been clicked")
      })
      

      【讨论】:

      • 它不起作用。由于 this.id 返回未定义,很可能再次出现。
      • @Esszed 你能用 event.srcElement.id 替换 this.id 吗?
      • 如果没有,您可以像其他答案一样使用内联事件
      • 它有效,有点有效。它正在从数据库中删除内容,但由于某种原因,我重定向到主路由不起作用。所以页面重新加载后删除的东西消失了
      • 也许你最好问一个关于这个问题的新问题
      【解决方案3】:

      您可以使用 onclick 并将您的值作为参数传递:

      <button class="delete-button" onclick="deleting(<%= item._id %>)">X</button>
      function deleting(value){
      fetch('/delete', { method: 'POST', data: {buttonId: value} })
        .then(function (response) {
          if (response.ok) {
            console.log('Delete was recorded')
            return
          }
          throw new Error('Request failed.')
        })
        .catch(function (error) {
          console.log(error)
        })
      

      }

      在服务器端:

      app.post('/delete', (req,res)=>{
      console.log("Deleted button has been clicked: "+ req.body.buttonId)
      })
      

      我猜你安装了body-parser?

      【讨论】:

      • 感谢您的回答,但由于某种原因 this.id 未定义。即使我删除了其余代码并只留下带有回调记录 this.id 的侦听器。
      • 是的,我意识到,这就是我编辑代码的原因。我现在用onclick 有效
      • 是的,现在可以了。谢谢你。我发现的另一个解决方案是在按钮周围放置表单并通过 req.body 获取它,这样可以毫无问题地传递值和名称,因此只需将值设置为 id。
      • @Esszed 我的回答怎么样?你试过了吗?顺便说一句,在进行删除操作时使用 delete 方法是一种休息惯例。同样在你的delete api中,路由url中没有delete是不好的,如果使用delete方法,已经很清楚这是一个delete操作。
      • @SuleymanSah 我没试过。我不想使用 jquery,因为到目前为止,我只会在我的整个应用程序中将它用于此操作。不过,谢谢你关于删除信息。我肯定会那样使用它。
      猜你喜欢
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多