Ajax DELETE请求路径不一致

问题描述 投票:0回答:1

我已经设置了一个快递服务器来处理不同的请求,其中之一是删除请求。它有时会工作,而其他时候会给出404。我注意到它发送的网址是不同的。因此,如果我更改服务器代码以处理一个路径,则它会起作用,直到客户端发送其他路径为止。我无法理解为什么它发送不同的URL,并且不一致。我是Web编程的新手。还是学生。可能是我缺少一些非常基本的东西。

正在从发送请求

http://localhost:3000/notes

页面。

昨天,请求已通过以下路径发送:

enter image description here

今天的请求是:

enter image description here

以防图像无法加载,这些是网址:

http://localhost:3000/api/notes/id

http://localhost:3000/notes/api/notes/id

这是客户端请求:(我已验证其以正确的值调用了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");
        })

      })

    });

有人可以帮我理解为什么它不一致吗?以及如何在服务器上处理它?

javascript node.js ajax express http-delete
1个回答
0
投票

更改客户端代码:

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,所以您需要一个斜杠。


需要清除服务器代码中的其他内容。

  1. 使用console.log(err)或类似的日志记录机制记录所有可能的错误。

  2. 永远,永远不要在异步回调中的服务器中写入if (err) throw err。这对您没有好处,因为没有人可以捕获该错误。相反,您必须始终记录错误,然后通过发送错误响应来处理错误。

  3. 从外部来源解析JSON可能会引发错误时,请使用try/catch对其进行环绕。

  4. << [因此您会错过数组中的下一个项目),或者需要向后迭代数组,以便.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"); }); }); });
  • © www.soinside.com 2019 - 2024. All rights reserved.