使用axios从mysql db中删除行。React作为前端,node.js和express.js作为后端
我正在尝试使用axios和React.js作为前端,node.js和express.js作为后端,从mysql数据库中删除该行。当我点击删除按钮时,这两个请求被视为发送。一个不显示任何内容,另一个则将其放入DevTools “无法删除/删除员工” 此外,它不会在终端中显示任何使用axios从mysql db中删除行。React作为前端,node.js和express.js作为后端,node.js,reactjs,Node.js,Reactjs,我正在尝试使用axios和React.js作为前端,node.js和express.js作为后端,从mysql数据库中删除该行。当我点击删除按钮时,这两个请求被视为发送。一个不显示任何内容,另一个则将其放入DevTools “无法删除/删除员工” 此外,它不会在终端中显示任何console.log语句 以下是存在删除路由问题的路由的代码 const express = require("express"); const app = express();
console.log
语句
以下是存在删除路由问题的路由的代码
const express = require("express");
const app = express();
const cors = require("cors");
const bodyParser = require("body-parser");
const logger = require("morgan");
const port = process.env.PORT || 3301;
var mysql = require("mysql");
app.use(cors());
const SELECT_ALL_USER_QUERY = 'SELECT * FROM employees';
const DELETE_QUERY = 'Delete from employees where id =';
app.use(logger('dev'));
app.use(cors());
app.use(bodyParser.urlencoded({extended : true}));
app.use(bodyParser.json());
var con = mysql.createConnection({
host: 'localhost',
user:'root',
password:"password",
database:'People'
});
con.connect(function (err){
if(err) {
console.log("Error Conneting To DB",err)
} else {
console.log("Connection Established");
}
});
//get Requets
app.get('/employees', (req, res) => {
con.query(SELECT_ALL_USER_QUERY, (err, result) => {
if(err) {
res.send(err);
} else {
let obj ={
data : result
}
console.log(obj);
res.send(result);
}
})
});
//Post Request
app.post('/employees',(req,resp)=>{
let data = {name:req.body.name , surname:req.body.surname, id:req.body.id};
let sql_query = "INSERT INTO employees SET ?"
console.log("DAATA UPLOADED")
let query = con.query(sql_query,data,(err,resp)=>{
if(err) {
console.log(err);
}
});
});
//Delete Request
// app.delete('/employees',(req,resp)=>{
// // DEBUG:
// let data = {id:req.body.id};
// let sql_query = "Delete from employees where id = ?"
// let query = con.query(sql_query,data,(err,resp)=>{
// if(err){
// console.log(err);
// }
// else {
// console.log(resp);
// }
// })
// })
// app.delete('/employees', function(req, res){
// console.log(con.query('DELETE FROM employees WHERE id =' + req.body.id));
// //con.query('DELETE FROM employees WHERE id ='+req.body.id, function(err, results){
// // if(err) throw err;
// // });
//
// // req.flash('success', 'Project Deleted');
// // res.location('/admin');
// // res.redirect('/admin');
// });
app.delete("/employees/:id", (req, res) => {
console.log("Request",req.params.id);
let { ID } = req.params.id;
let sql = `DELETE FROM employees WHERE ID = ${req.params.id}`;
console.log("HI",sql);
// delete a row with id = req.params.id
conn.query(sql, (error, results, fields) => {
if (error) return console.error("ERROR HI",error.message);
res.status(200).send(results);
console.log("Deleted Row(s):", results.affectedRows);
});
});
app.listen(4000, () => {
console.log('server running on port 4000')
})
module.exports = app;
对于ReactJs,有一个函数deleteName
,其中使用axios编写了删除调用。代码如下:
import React from 'react';
import './App.css';
import axios from 'axios';
class App extends React.Component {
constructor(props){
super(props);
this.onNameChange = this.onNameChange.bind(this);
this.onSurnameChange = this.onSurnameChange.bind(this);
this.onIdChange = this.onIdChange.bind(this);
this.editName = this.editName.bind(this);
this.state = {
data:'',
name:'',
surname:'',
id:''
}
}
componentDidMount() {
axios.get('http://localhost:4000/employees').then((response,err)=> {
if(err) {
console.log('err');
}
this.setState((prevstate) =>
({
data: response.data
})
);
})
}
handleSumbit(e){
axios.post('http://localhost:4000/employees',{
name: this.state.name,
surname: this.state.surname,
id:this.state.id,
}).then((response,err)=>{
if(err) {
console.log("Error While Posting Data",err);
}
console.log("RESPONSE FROM POST",response);
})
}
onNameChange(e){
this.setState({
name:e.target.value
});
}
onSurnameChange(e) {
this.setState({
surname:e.target.value
})
}
onIdChange(e){
this.setState({
id:e.target.value
});
}
editName(e,firstname,lastname,id){
this.setState({
name:firstname,
surname:lastname,
id:id
});
}
deleteName(e,value) {
axios.delete('http://localhost:4000/delete/' + value).then((response) => {
// this only runs on success
console.log("RESPONSE FROM POST", response.data);
}, (err) => {
// this only runs on error
console.log("Error While Posting Data", err);
});
}
}
render() {
const {data} = this.state;
return (
<div className="container">
<div>
<label className="">Name</label>
<input type="text" name="" value={this.state.name} onChange={(e)=>this.onNameChange(e)}/>
</div>
<div>
<label className="">Surname</label>
<input type="text" name="" value={this.state.surname} onChange={(e)=>this.onSurnameChange(e)}/>
</div>
<div>
<label className=""> YOUR ID </label>
<input type="number" name="" value={this.state.id} onChange={(e)=>this.onIdChange(e)}/>
</div>
<div>
<button type="button" onClick={(e)=> this.handleSumbit(e)}>Sumbit</button>
</div>
<div className="main-container">
<h1>Name</h1>
{
data && data.map((data,key) => {
return(
<React.Fragment>
<div className="child">
{data.name}
<button onClick={(e)=> this.editName(e,data.name,data.surname,data.id)}>Edit</button>
<button onClick={(e)=> this.deleteName(e,data.id)}>Delete</button>
</div>
</React.Fragment>
)
})
}
</div>
</div>
)
}
}
export default App;
从“React”导入React;
导入“/App.css”;
从“axios”导入axios;
类应用程序扩展了React.Component{
建造师(道具){
超级(道具);
this.onNameChange=this.onNameChange.bind(this);
this.onSurnameChange=this.onSurnameChange.bind(this);
this.onIdChange=this.onIdChange.bind(this);
this.editName=this.editName.bind(this);
此.state={
数据:“”,
名称:“”,
姓:'',
id:“”
}
}
componentDidMount(){
axios.get()http://localhost:4000/employees)。然后((响应,错误)=>{
如果(错误){
console.log('err');
}
this.setState((prevstate)=>
({
数据:response.data
})
);
})
}
handleSumbit(e){
轴心柱http://localhost:4000/employees',{
名称:this.state.name,
姓:this.state.姓氏,
id:this.state.id,
}).然后((响应,错误)=>{
如果(错误){
日志(“发布数据时出错”,err);
}
日志(“来自POST的响应”,响应);
})
}
onNameChange(e){
这是我的国家({
名称:e.target.value
});
}
onSurnameChange(e){
这是我的国家({
姓氏:e.target.value
})
}
onIdChange(e){
这是我的国家({
id:e.target.value
});
}
editName(e,firstname,lastname,id){
这是我的国家({
姓名:名字,
姓:姓,,
id:id
});
}
deleteName(e,值){
axios.delete('http://localhost:4000/delete/“+值)。然后((响应)=>{
//这只取决于成功
日志(“来自POST的响应”,RESPONSE.data);
},(错误)=>{
//这只在出错时运行
日志(“发布数据时出错”,err);
});
}
}
render(){
const{data}=this.state;
返回(
名称
this.onNameChange(e)}/>
姓
this.onSurnameChange(e)}/>
你的身份证
this.onIdChange(e)}/>
this.handleSumbit(e)}>Sumbit
名称
{
data&&data.map((数据,键)=>{
返回(
{data.name}
this.editName(e,data.name,data.姓氏,data.id)}>Edit
this.deleteName(e,data.id)}>Delete
)
})
}
)
}
}
导出默认应用程序;
错误“无法删除/employees”表示名为/employees
的路由不存在。您需要调用路由/delete/:id
另一方面,我注意到您在axios中没有正确处理错误。。然后
函数接受两次回调,第一次在成功时执行,另一次在出错时执行
总之,这两件事结合起来,试着这样做:
axios.delete('http://localhost:4000/delete/' + value).then((response) => {
// this only runs on success
console.log("RESPONSE FROM POST", response.data);
}, (err) => {
// this only runs on error
console.log("Error While Posting Data", err);
});
您正在向名为
/employees
的路由发送请求,但后端正在处理名为/delete/:id
的路由。你需要在其中一个地方更改路线当我打电话到/delete/:id
时,它说“cannotelete/employees/678`@SAMAR,这没有任何意义。如果您请求/delete/678
,则不可能得到该错误。您可能没有向我们展示其他一些重要的代码。@请编辑您的问题并将其放入其中,代码在注释中的格式不正确。从这里我可以看到,虽然路线名称很好。前端必须仍然以某种方式向/employees
发送请求。错误无法删除/employees/678
字面意思是“您试图调用路由/employees/678,但它不存在”。因此前端仍在调用错误的URL。更新了有问题的我的代码。请您看一看。@SAMAR实际上,从更深一层阅读React代码后,看起来您正在调用GET/employees
路径,而这实际上是引发错误的地方。不允许删除。是否存在名为/employees
的路由?