我正在使用node,express,mysql创建一个简单的应用程序。
我正在尝试创建一个可以从数据库中删除一行的路由,我写了一个纯 javascript xhr。
当我测试它时,我不断收到以下错误消息
POST http://localhost:3000/article/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);
}
}
和路由应用程序.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('/')
}
});
});
我错过了什么?
非常感谢帮助! 谢谢。
将POST
更改为main.js
文件中的DELETE
:
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
,但默认情况下表达不会区分这些情况
app.delete
希望收到 DELETE 请求。
xmlhttp.open("POST", page, true);
正在发送 POST 请求。
将第二个参数更改为"DELETE"
以发出 DELETE 请求。
您的服务器中有一个删除路由,因此如果要向该路由发送请求,则应"DELETE"
参数传递给XMLHTTP。
所以简单地改变
xmlhttp.open("POST", page, true);
自
xmlhttp.open("DELETE", page, true);
此外,此答案可以帮助您更好地理解使用XMLHttpRequest
不要将参数直接插入数据库查询中
正如其他人所说,您容易受到 SQLInjection 攻击。 您应该首先计算参数,而不是将其直接插入到 SQL 查询中