我已经设置了一个快递服务器来处理不同的请求,其中之一是删除请求。它有时会工作,而其他时候会给出404。我注意到它发送的网址是不同的。因此,如果我更改服务器代码以处理一个路径,则它会起作用,直到客户端发送其他路径为止。我无法理解为什么它发送不同的URL,并且不一致。我是Web编程的新手。还是学生。可能是我缺少一些非常基本的东西。
正在从发送请求
页面。
昨天,请求已通过以下路径发送:
今天的请求是:
以防图像无法加载,这些是网址:
这是客户端请求:(我已验证其以正确的值调用了delete)
var deleteNote = function(id) {
return $.ajax({
url: "api/notes/" + id,
method: "DELETE"
});
};
这是服务器代码:
app.delete("/api/notes/:id", (req, res) => {
let chosenNoteToDelete = req.params.id;
fs.readFile(__dirname + "/db/db.json", (err, data) => {
if(err){
throw err;
}
let json = JSON.parse(data);
for(let i=0; i<json.length; i++){
if(json[i].id === chosenNoteToDelete){
json.splice(i,1);
}
}
fs.writeFile(__dirname + "/db/db.json", JSON.stringify(json), (err) => {
if(err){
throw err;
}
res.send("Successfully deleted");
})
})
});
有人可以帮我理解为什么它不一致吗?以及如何在服务器上处理它?
更改客户端代码:
var deleteNote = function(id) {
return $.ajax({
url: "api/notes/" + id,
method: "DELETE"
});
};
至此:
var deleteNote = function(id) {
return $.ajax({
url: "/api/notes/" + id,
method: "DELETE"
});
};
您的相对路径告诉jQuery将您的路径与页面URL中的路径结合起来。您不需要相对路径。您始终希望它是/api/notes/id
,所以您需要一个斜杠。
需要清除服务器代码中的其他内容。
使用console.log(err)
或类似的日志记录机制记录所有可能的错误。
永远,永远不要在异步回调中的服务器中写入if (err) throw err
。这对您没有好处,因为没有人可以捕获该错误。相反,您必须始终记录错误,然后通过发送错误响应来处理错误。
从外部来源解析JSON可能会引发错误时,请使用try/catch
对其进行环绕。
.splice()
操作不会影响迭代。return
并且,如果没有找到selectedNote,这是使用.splice()
和.splice()
的更干净的实现,具有更集中的错误处理和检测:app.delete("/api/notes/:id", (req, res) => { let chosenNoteToDelete = req.params.id; fs.readFile(__dirname + "/db/db.json", (err, data) => { if (err) { console.log(err); res.sendStatus(500); return; } try { let json = JSON.parse(data); } catch(e) { console.log(err); res.sendStatus(500); return; } for (let i = 0; i < json.length; i++) { if (json[i].id === chosenNoteToDelete) { json.splice(i, 1); return; } } fs.writeFile(__dirname + "/db/db.json", JSON.stringify(json), (err) => { if (err) { console.log(err); res.sendStatus(500); return; } res.send("Successfully deleted"); }); }); });