【问题标题】:Matching a delete request to a json object将删除请求与 json 对象匹配
【发布时间】:2018-12-07 14:23:33
【问题描述】:

当对象值使用 AJAX 删除功能以表单显示时,我试图从 json 文件中删除该对象。我正在使用 express 为 json 文件生成路由,如下所示:

app.get('/users', (req, res) => {
    var userData = json;
    
    res.send(userData);
        
        }), 
        
app.delete('/users/delete/:id', (req, res) => {
    var key = req.params.id;
    var deletedData = json;
    
    deletedData.splice(key, 1);
    res.send(deletedData);

});

      $(document).on('click', '#delete', function () {
             $.ajax({
                    type: "DELETE"
                    , url: "users/delete/"+data[key]  
                    , datatype: "datatype"
                    , success: function (data) {
                        console.log(data);
       
                        }   
                });
            });

我知道我没有声明数据[key],这只是我想做的事情的上下文。我的问题是尝试选择特定的 json 对象,而不仅仅是选择第一个对象,我现在拥有“users/delete/0”,有人知道该怎么做吗?

编辑

我正在尝试获取特定于在我的 html 表单中显示的对象的“用户/删除/:id”

                <div class="col-md-5 col-sm-12">
                    <div id="full_details">
                        <ul class="details">
                            <h2>Contact Details</h2> <img src="" alt="Avatar" id="avatar">
                            
                            
                            <li>Name
                                <input type="text" id="name" class="form-control mr-sm-2" disabled>
                            </li>
                            <li>Address
                                <input type="text" id="address" class="form-control mr-sm-2" disabled>
                            </li>
                            <li>Contact Number
                                <input type="text" id="phone" class="form-control mr-sm-2" disabled>
                            </li>
                            <li>Email
                                <input type="text" id="email" class="form-control mr-sm-2" disabled>
                            </li>
                            <li>Postcode
                                <input type="text" id="postcode" class="form-control mr-sm-2" disabled>
                            </li>
                            <li>City
                                <input type="text" id="city" class="form-control mr-sm-2"disabled>
                            </li>
                            <li>Country
                                <input type="text" id="country" class="form-control mr-sm-2" disabled>
                            </li>
                            <div class="row">
                                <div class="col-md-6">
                                    <div id="editbutton">
                                        <p class="btn btn-primary">Edit Details</p>
                                    </div>
                                </div>
                                <div class="col-md-6">
                                    <div id="savebutton">
                                        <p class="btn btn-danger">Save Details</p>
                                    </div>
                                </div>
                                <div class="col-md-6">
                                    <div id="delete">
                                        <p class="btn btn-danger">delete</p>
                                    </div>
                                </div>
                            </div>
                        </ul>
                    </div>
                </div>

【问题讨论】:

  • 我不确定我是否理解这个问题。你是什​​么意思我现在拥有的第一个对象
  • 如果我将“users/delete/0”作为 ajax 删除函数中的 url,它将删除我的 json 文件中的第一个对象,我试图让函数删除拉取的特定对象以这种形式是否有意义?
  • 啊,是的。您需要遍历数组(我假设您的用户数据是一个数组)并找到具有匹配 id 的对象的索引,然后从该索引拼接。看看这是否有帮助:stackoverflow.com/questions/5767325/…

标签: javascript jquery json ajax express


【解决方案1】:

当您将数据填充到字段中时,我假设您将拥有该记录的id

将其存储在变量中/或者您可以直接从获取的对象中获取它 (object.id)

暂时我会把它存储在一个变量中。

假设下面是您提取并显示的对象数据:

var obj = {
   id:1,
   name: "Test",
   address:"Test Address"   
}
var objId = obj.id; //I'll use this id in AJAX request.

然后调用AJAX请求。

 $.ajax({
             type: "DELETE"
            , url: "users/delete/"+objId  
            , datatype: "datatype"
            , success: function (data) {
                 console.log(data);

                }   
                });

节点 Js:

app.delete('/users/delete/:id', (req, res) => {
       let deleteId = req.params.id; //Get the id through req.params.id of the object you are going to delete
       let deleteObj = userJson.find(user => user.id == deleteId); // As you have only Id of the object, we want to get the entire object from the array. find() will fetch the object from the array whose id is equal to deleteId and assign it to deleteObj.
       let deleteIndex = userJson.indexOf(deleteObj); //Find the index of the object fetched from the JSON array.
       userJson.splice(deleteIndex,1); // Splice/ remove the object from the JSON Array.
      res.send(deleteObj); // Send the deleted object as response.
});

【讨论】:

  • 这工作谢谢!我只需要更改一些变量,我的文件中没有值“id”,所以我只调用了“名称字段”:)
【解决方案2】:

需要在您要执行操作的位置提供 JSON 数据。如果您尚未在 sn-p 之外执行此操作,则需要将您的 JSON 放入您的 Express 删除路由所在的文件中。

在您当前的 delete 路由中,.splice 方法仅适用于字符串和数组(除非您在 Object.prototype 上定义该方法)。

这是一个delete 路由的示例,如果您的 JSON 数据是一个对象:

let userJSON = require('./users.json');

app.delete('/users/delete/:id', (req, res) => {
    let key = req.params.id;
    if( delete userJSON.key ){
        res.send(`User ${key} deleted`);
    }
}

如果对象的键被成功删除,if 语句中的 delete 运算符返回 true。在某些情况下您无法使用此运算符,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete 以检查它是否与您要执行的操作兼容。

编辑 1:被误解的问题,所以这里是正确的 delete 方法

let userJSON = require('./users.json');

app.delete('/users/delete/:id', (req, res) => {
    let key = req.params.id;
    for( let i=0; i<userJSON.length; i++){
        if( userJSON[i].id === key ){
            userJSON.splice(i,1);
        }
    }
});

【讨论】:

  • 感谢这个 achacttn,但是我需要成为特定于我的 html 表单中的对象的“:id”,你知道怎么做吗?我将编辑我的问题以显示我的 html。
  • 如果我弄错了,请纠正我,是 :id,您要删除用户对象的属性(用户名或电话等),或删除具有唯一 ID 的整个用户,从用户列表或数组?
  • 是的,我想从列表中删除整个用户
  • 您提供的 HTML 表单 sn-p 并未说明data[key]:id 是如何生成的。 sn-p 看起来像一个用户创建表单。
  • 当用户的名字被点击时,用户的详细信息被插入到输入值中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多