使用node、mysql、express和pure js从数据库中删除一行

quhf5bfb  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(208)

我正在用node,express,mysql创建一个简单的应用程序。
我正在尝试创建一个路由,用它可以从数据库中删除一行,我编写了一个纯javascript xhr。
当我测试它时,我不断得到以下错误消息
岗位http://localhost:3000/文章/22 404(未找到)
这就是我所拥有的:
主要.js

function handleDeleteClick(e, userId) {
    e.preventDefault(); // Prevent default behaviour of this event (eg: submitting the form

    // Perform the AJAX request to delete this user
    var target = e.target;
    var id = target.getAttribute('data-id');
    var page = '/article/' + id;
    var parameters = 'delete=true';
    var xmlhttp = new XMLHttpRequest();

    if (confirm('Are you sure you want to delete this?') == true) {
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                // Request completed
            }
        }
        xmlhttp.open("POST", page, true);
        xmlhttp.send(parameters);
    }
}

以及路线app.js

app.delete('/article/:id', function(req, res) {
    con.query(`DELETE FROM posts WHERE posts.id = ${req.params.id}`,
        function(err, result, fields) {
            if (err) {
                console.log(err);
            } else {
                console.log("deleted Record: " + result.affectedRows);
                res.redirect('/')
            }
        });
});

我错过了什么?
非常感谢您的帮助!谢谢。

qybjjes1

qybjjes11#

改变 POSTDELETE 在你的 main.js -文件:

xmlhttp.open("DELETE", page, true);

你得到这个了 404 NOT FOUND 错误,因为路由 POST /article/:id 不存在(它是 DELETE /article/:id ).
注意:您的delete查询易受sql注入攻击的攻击
转义查询值:

con.query('DELETE FROM posts WHERE posts.id = ?', [req.params.id]);

注意:实际上,这种情况下正确的http状态是 405 METHOD NOT ALLOWED ,但默认情况下express不区分这些情况

w6lpcovy

w6lpcovy2#

app.delete 期望收到删除请求。 xmlhttp.open("POST", page, true); 正在发送post请求。
将第二个参数改为 "DELETE" 发出删除请求。

nzk0hqpo

nzk0hqpo3#

服务器中有一个删除路由,因此如果要向该路由发送请求,应该传递 "DELETE" xmlhttp的参数。
所以只要改变

xmlhttp.open("POST", page, true);

xmlhttp.open("DELETE", page, true);

此外,这个答案可能有助于您理解 XMLHttpRequest 更好的
不要直接在数据库查询中插入参数
正如其他人所说,您很容易受到sqlinjection攻击。应该首先计算params,而不是直接将其插入sql查询

相关问题