过去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:意外令牌 fetch.then.response @ app.js:120 承诺。然后(异步) deleteData @ app.js:121 document.getElementById.onclick @ app.js:138 at fetch.then.response (app.js:120)
答案 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”