Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax删除请求路径不一致_Javascript_Node.js_Ajax_Express_Http Delete - Fatal编程技术网

Javascript Ajax删除请求路径不一致

Javascript Ajax删除请求路径不一致,javascript,node.js,ajax,express,http-delete,Javascript,Node.js,Ajax,Express,Http Delete,我已经设置了一个express服务器来处理不同的请求,其中一个是删除请求。它有时工作,有时给出404。我注意到它发送的url是不同的。因此,如果我将服务器代码更改为处理一条路径,它将一直工作,直到客户端发送另一条路径。我无法理解为什么它发送不同的URL并且不一致。我对网络编程非常陌生;还是个学生。可能是我遗漏了一些非常基本的东西 正在从发送请求 页面 昨天,请求通过以下路径发送: 今天的请求是: 为了防止图像无法加载,以下是URL: 这是客户端请求:(我已经验证了它使用正确的值调用de

我已经设置了一个express服务器来处理不同的请求,其中一个是删除请求。它有时工作,有时给出404。我注意到它发送的url是不同的。因此,如果我将服务器代码更改为处理一条路径,它将一直工作,直到客户端发送另一条路径。我无法理解为什么它发送不同的URL并且不一致。我对网络编程非常陌生;还是个学生。可能是我遗漏了一些非常基本的东西

正在从发送请求

页面

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

今天的请求是:

为了防止图像无法加载,以下是URL:

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

      })

    });
app.delete(“/api/notes/:id)”,(req,res)=>{
让chosenNoteToDelete=req.params.id;
fs.readFile(uu dirname+“/db/db.json”,(err,data)=>{
如果(错误){
犯错误;
}
让json=json.parse(数据);
for(设i=0;i{
如果(错误){
犯错误;
}
res.send(“已成功删除”);
})
})
});

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

从以下位置更改客户端代码:

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()
    操作时,您需要在处理
    .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");
            });
        });
    });
    

    您使用的是
    “api/notes/”+id
    ,但这是一个相对路径。尝试将其更改为
    “/api/notes/”+id
    ,以使其成为绝对路径。是否使用基本源代码帮助
    const base\u url=window.location.origin使用它就像
    base\u url+“api/notes/”+id
    我很感谢您的详细回答。非常有用。由于我还不能投票,我想留下一条评论,尽管我知道这一部分不能用来表示感谢。
    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");
            });
        });
    });
    
    const fsp = require('fs').promises;
    const path = require('path');
    
    app.delete("/api/notes/:id", async (req, res) => {
        let chosenNoteToDelete = req.params.id;
        let dataFilename = path.join(__dirname, "/db/db.json");
        try {
            let data = await fsp.readFile(dataFilename);
            let dataArray = JSON.parse(data);
            // iterate array backwards so .splice() doesn't cause us to miss elements of the array
            let found = false;
            for (let i = dataArray.length - 1; i >= 0; i--) {
                if (dataArray[i].id === chosenNoteToDelete) {
                    found = true;
                    dataArray.splice(i, 1);
                }
            }
            if (found) {
                await fsp.writeFile(dataFilename, JSON.stringify(dataArray));
                res.send("Successfully deleted");
            } else {
                res.status(404).send(`Note id ${chosenNoteToDelete} not found.`);
            }
    
        } catch(e) {
            console.log(e);
            res.sendStatus(500);
        }
    });