NodeJS CRUD API删除方法出现问题

时间:2018-08-19 22:01:05

标签: javascript json node.js crud http-status-code-400

过去2天,我一直在尝试获取nodejs CRUD api的Delete部分,但我无法弄清楚出了什么问题。我仍在学习-一定是我没有看到某些东西导致它无法正常工作。

在服务器端,我的删除路由如下:

app.delete('/delete-lion/:id',(req, res)=>{
    // console.log('ID', req.body.id);
    var lion = lions.findIndex(lion=>lion.id==req.body.id);
    if(!lions[lion]){
        res.send();
    }else{
        var deletedLion = lions[lion];
        lions.splice(lions,1);
        res.json(deletedLion);
        res.send();
    }
})

在客户端,这就是我所拥有的(app.js ...“ checky”是每个项目旁边能够选择和删除的复选框的ID。)

 function deleteData(id){
     return fetch('http://localhost:9091/delete-lion',{
        method: "delete",
        headers: {
            'Accept': 'application/json',
            'Content-Type' : 'application/json',
        },
        credentials: "include",
        body: JSON.stringify(id)
     })
     .then(response => response.json(id))
     .then(response=>{
        if(document.getElementById('checky').checked){
            document.getElementById(response.id).remove()
            return response.id
        } 
        
     })
 }



window.onload = function(){
    getData();
    document.getElementById('add-new-lion').onclick = ()=>{
        displayAddForm()
    };
    document.getElementById('deletey-lion').onclick = ()=>{
        deleteData(0)
        // console.log(e)
    }
}

这是我在控制台中收到的错误:

app.js:111 DELETE http://localhost:9091/delete-lion 400(错误请求) deleteData @ app.js:111

document.getElementById.onclick @ app.js:138

app.js:120未捕获(承诺)SyntaxError:意外令牌

at fetch.then.response (app.js:120)

fetch.then.response @ app.js:120

承诺。然后(异步)

deleteData @ app.js:121

document.getElementById.onclick @ app.js:138

2 个答案:

答案 0 :(得分:2)

您的服务器正在监听'/delete-lion/:id'上的DELETE请求。在此路径中,id参数是必需的。您的服务器将响应

fetch('http://localhost:9091/delete-lion/1337'),

fetch('http://localhost:9091/delete-lion/omygoditsalion'),

但不是

fetch('http://localhost:9091/delete-lion').

要解决您的问题,您需要从路由中删除/:id,或者让您的请求将lion.id作为路由参数发送(在回调中由req.params.id引用)而不是在请求正文中。您还可以通过将route参数更改为'/delete-lion/:id?'来使它成为可选参数,但这会造成混淆-当您的后续代码期望在URI中将id参数设置为URI时,您可能不希望这样做。身体。

答案 1 :(得分:0)

无需将单独的body参数传递给Fetch API调用, 而是只需将“ id”参数附加到Fetch调用中,如下所示:

function deleteData(id){
 let url = 'http://localhost:9091/delete-lion/'+id;
 return fetch(url,{
    method: "delete",
    headers: {
        'Accept': 'application/json',
        'Content-Type' : 'application/json',
    },
    credentials: "include" //No need for body since ID is passed as param in the URL
  })
  ...
  ...
}

在服务器端,您将不得不替换

var lion = lions.findIndex(lion=>lion.id==req.params.id);//body with params

这应该解决它。而且这也是RESTful的,而不是在体内传递“ id”