【问题标题】:deleting a row from db using node, mysql, express and pure js使用节点、mysql、express和纯js从db中删除一行
【发布时间】:2018-10-04 14:15:03
【问题描述】:

我正在使用 node、express、mysql 创建一个简单的应用程序。

我正在尝试创建一个可以从我的数据库中删除一行的路由,我编写了一个纯 javascript xhr。

当我测试它时,我不断收到以下错误消息

POST http://localhost:3000/article/22 404(未找到)

这就是我所拥有的:

main.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('/')
            }
        });
});

我错过了什么?

非常感谢您的帮助! 谢谢。

【问题讨论】:

标签: javascript mysql node.js express


【解决方案1】:

在您的main.js-文件中将POST 更改为DELETE

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

您收到此404 NOT FOUND 错误,因为路由POST /article/:id 不存在(它是DELETE /article/:id)。

注意:您的 DELETE 查询容易受到 SQL 注入 攻击 escaping-query-values

转义查询值:

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

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

【讨论】:

  • 感谢所有回答!我会将这个设置为“最佳”答案,因为它是最完整的并且指出了最多的焦点。谢谢!我知道这个漏洞,但这是为了以后的问题,因为我首先在本地环境中启动并运行东西,然后再保护它。非常感谢!
  • 还有一个问题,为什么删除后不重新路由?
  • @Bee 我认为你需要在前端处理它
  • 正确!对于那个很抱歉。事实上,这需要在 main.js 中完成。再次感谢。
【解决方案2】:

app.delete 期望收到 DELETE 请求。

xmlhttp.open("POST", page, true); 正在发送 POST 请求。

将第二个参数更改为 "DELETE" 以发出 DELETE 请求。

【讨论】:

    【解决方案3】:

    您的服务器中有一个删除路由,所以如果您想向该路由发送请求,您应该将"DELETE" 参数传递给 xmlhttp。

    所以简单地改变

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

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

    另外,this answer 可以帮助您更好地理解使用XMLHttpRequest

    不要将参数直接插入到数据库查询中

    正如其他人所说,您很容易受到 SQLInjection 攻击。你应该首先评估参数,而不是直接将它插入到你的 SQL 查询中

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 2021-11-16
      • 2012-02-07
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多