У меня есть приложение со списком задач из "https://codingthesmartway.com/the-mern-stack-tutorial-building-a-react-crud-application-from-start-to-finish-part-1/", в котором есть база данных MongoDB, поэтому я пытаюсь изменить его в MySQL, но у меня довольно трудные времена.
app. js
import React, { Component } from "react";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import "bootstrap/dist/css/bootstrap.min.css";
import CreateTodo from "./components/create-todo.component";
import EditTodo from "./components/edit-todo.component";
import TodosList from "./components/todos-list.component";
import logo from "./logo.png";
var express = require('express');
var bodyParser = require('body-parser');
var connection = require('./backend/config/connection');
var routes = require('./backend/controllers/routes');
var app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
connection.init();
routes.configure(app);
var server = app.listen(4000, function(){
console.log('Server listening on port ' + server.address().port);
});
class App extends Component {
render() {
return (
<Router>
<div className="container">
<nav className="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="https://www.youtube.com" target="_blank">
<img src={logo} width="30" height="30" alt="CodingTheSmartWay.com" />
</a>
<Link to="/" className="navbar-brand">Aftab Todo App</Link>
<div className="collpase navbar-collapse">
<ul className="navbar-nav mr-auto">
<li className="navbar-item">
<Link to="/" className="nav-link">Todos</Link>
</li>
<li className="navbar-item">
<Link to="/create" className="nav-link">Create Todo</Link>
</li>
</ul>
</div>
</nav>
<br/>
<Route path="/" exact component={TodosList} />
<Route path="/edit/:id" component={EditTodo} />
<Route path="/create" component={CreateTodo} />
</div>
</Router>
);
}
}
export default App;
}
create-todo.cpmopnent. js
import React, { Component } from 'react';
import axios from 'axios';
export default class CreateTodo extends Component {
constructor(props) {
super(props);
this.onChangeTodoSerialno = this.onChangeTodoSerialno.bind(this);
this.onChangeTodoDescription = this.onChangeTodoDescription.bind(this);
this.onChangeTodoResponsible = this.onChangeTodoResponsible.bind(this);
this.onChangeTodoPriority = this.onChangeTodoPriority.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {
todo_Serial_no: '',
todo_description: '',
todo_responsible: '',
todo_priority: '',
todo_completed: false
}
}
onChangeTodoSerialno(e) {
this.setState({
todo_Serial_no: e.target.value
});
}
onChangeTodoDescription(e) {
this.setState({
todo_description: e.target.value
});
}
onChangeTodoResponsible(e) {
this.setState({
todo_responsible: e.target.value
});
}
onChangeTodoPriority(e) {
this.setState({
todo_priority: e.target.value
});
}
onSubmit(e) {
e.preventDefault();
console.log(`Form submitted:`);
console.log(`Todo Seriseno: ${this.state.todo_Serial_no}`);
console.log(`Todo Description: ${this.state.todo_description}`);
console.log(`Todo Responsible: ${this.state.todo_responsible}`);
console.log(`Todo Priority: ${this.state.todo_priority}`);
const newTodo = {
todo_Serise_no: this.state.todo_Serial_no,
todo_description: this.state.todo_description,
todo_responsible: this.state.todo_responsible,
todo_priority: this.state.todo_priority,
todo_completed: this.state.todo_completed
};
axios.post('http://localhost:4000/todos/add', newTodo)
.then(res => console.log(res.data));
this.setState({
todo_Serial_no: '',
todo_description: '',
todo_responsible: '',
todo_priority: '',
todo_completed: false
})
}
render() {
return (
<div style={{marginTop: 10}}>
<h3>Create New Todo</h3>
<form onSubmit={this.onSubmit}>
<div className="form-group">
<label>Description: </label>
<input type="text"
className="form-control"
value={this.state.todo_description}
onChange={this.onChangeTodoDescription}
/>
</div>
<div className="form-group">
<label>Responsible: </label>
<input
type="text"
className="form-control"
value={this.state.todo_responsible}
onChange={this.onChangeTodoResponsible}
/>
</div>
<div className="form-group">
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityLow"
value="Low"
checked={this.state.todo_priority==='Low'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">Low</label>
</div>
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityMedium"
value="Medium"
checked={this.state.todo_priority==='Medium'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">Medium</label>
</div>
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityHigh"
value="High"
checked={this.state.todo_priority==='High'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">High</label>
</div>
</div>
<div className="form-group">
<input type="submit" value="Create Todo" className="btn btn-primary" />
</div>
</form>
</div>
)
}
}
edit-todo.component. js
import React, { Component } from 'react';
import axios from 'axios';
export default class EditTodo extends Component {
constructor(props) {
super(props);
//this.onChangeTodoSerial_no = this.onChangeTodoSerial_no.bind(this);
this.onChangeTodoDescription = this.onChangeTodoDescription.bind(this);
this.onChangeTodoResponsible = this.onChangeTodoResponsible.bind(this);
this.onChangeTodoPriority = this.onChangeTodoPriority.bind(this);
this.onChangeTodoCompleted = this.onChangeTodoCompleted.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {
//todo_Serial_no: '',
todo_description: '',
todo_responsible: '',
todo_priority: '',
todo_completed: false
}
}
componentDidMount() {
axios.get('http://localhost:4000/todos/'+this.props.match.params.id)
.then(response => {
this.setState({
//todo_Serial_no: response.data.todo_Serial_no,
todo_description: response.data.todo_description,
todo_responsible: response.data.todo_responsible,
todo_priority: response.data.todo_priority,
todo_completed: response.data.todo_completed
})
})
.catch(function (error) {
console.log(error);
})
}
/*onChangeTodoserialno(e) {
this.setState({
todo_Serial_no: e.target.value
});
}*/
onChangeTodoDescription(e) {
this.setState({
todo_description: e.target.value
});
}
onChangeTodoResponsible(e) {
this.setState({
todo_responsible: e.target.value
});
}
onChangeTodoPriority(e) {
this.setState({
todo_priority: e.target.value
});
}
onChangeTodoCompleted(e) {
this.setState({
todo_completed: !this.state.todo_completed
});
}
onSubmit(e) {
e.preventDefault();
const obj = {
//todo_Serial_no: this.state.todo_Serial_no,
todo_description: this.state.todo_description,
todo_responsible: this.state.todo_responsible,
todo_priority: this.state.todo_priority,
todo_completed: this.state.todo_completed
};
console.log(obj);
axios.post('http://localhost:4000/todos/update/'+this.props.match.params.id, obj)
.then(res => console.log(res.data));
this.props.history.push('/');
}
render() {
return (
<div>
<h3 align="center">Update Todo</h3>
<form onSubmit={this.onSubmit}>
<div className="form-group">
<label>Description: </label>
<input type="text"
className="form-control"
value={this.state.todo_description}
onChange={this.onChangeTodoDescription}
/>
</div>
<div className="form-group">
<label>Responsible: </label>
<input
type="text"
className="form-control"
value={this.state.todo_responsible}
onChange={this.onChangeTodoResponsible}
/>
</div>
<div className="form-group">
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityLow"
value="Low"
checked={this.state.todo_priority==='Low'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">Low</label>
</div>
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityMedium"
value="Medium"
checked={this.state.todo_priority==='Medium'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">Medium</label>
</div>
<div className="form-check form-check-inline">
<input className="form-check-input"
type="radio"
name="priorityOptions"
id="priorityHigh"
value="High"
checked={this.state.todo_priority==='High'}
onChange={this.onChangeTodoPriority}
/>
<label className="form-check-label">High</label>
</div>
</div>
<div className="form-check">
<input className="form-check-input"
id="completedCheckbox"
type="checkbox"
name="completedCheckbox"
onChange={this.onChangeTodoCompleted}
checked={this.state.todo_completed}
value={this.state.todo_completed}
/>
<label className="form-check-label" htmlFor="completedCheckbox">
Completed
</label>
</div>
<br />
<div className="form-group">
<input type="submit" value="Update Todo" className="btn btn-primary" />
</div>
</form>
</div>
)
}
}
todos-list.component. js
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import axios from 'axios';
const Todo = props => (
<tr>
<td className={props.todo.todo_completed ? 'completed' : ''}>{props.todo.todo_Serial_no}</td>
<td className={props.todo.todo_completed ? 'completed' : ''}>{props.todo.todo_description}</td>
<td className={props.todo.todo_completed ? 'completed' : ''}>{props.todo.todo_responsible}</td>
<td className={props.todo.todo_completed ? 'completed' : ''}>{props.todo.todo_priority}</td>
<td>
<Link to={"/edit/"+props.todo._id}>Edit</Link>
</td>
</tr>
)
export default class TodosList extends Component {
constructor(props) {
super(props);
this.state = {todos: []};
}
componentDidMount() {
axios.get('http://localhost:4000/todos/')
.then(response => {
this.setState({ todos: response.data });
})
.catch(function (error){
console.log(error);
})
}
componentDidUpdate()
{
axios.get('http://localhost:4000/todos/')
.then(response => {
this.setState({ todos: response.data });
})
.catch(function (error){
console.log(error);
})
}
todoList() {
return this.state.todos.map(function(currentTodo, i){
return <Todo todo={currentTodo} key={i} />;
})
}
render() {
return (
<div>
<h3>Todos List</h3>
<table className="table table-striped" style={{ marginTop: 20 }} >
<thead>
<tr>
<th>Serial no</th>
<th>Description</th>
<th>Responsible</th>
<th>Priority</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{ this.todoList() }
</tbody>
</table>
</div>
)
}
}
сервер. js
У меня проблема здесь, я не знаю, как связаться с MySQL база данных. пожалуйста, помогите мне, я новичок и учусь здесь.
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mysql = require('mysql');
const todoRoutes = express.Router();
const PORT = 4000;
app.use(cors());
app.use(bodyParser.json());
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'system',
database: 'db'
});
connection.connect(err => {
if (err) {
return err;
}
});
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
todoRoutes.get('/todos', (req, res) => {
connection.query("Select * from todos",
(err, result) => {
if (err) {
res.send(err)
}
console.log(result);
res.send({
data: result
});
}
)
});
app.get('/todos/:id', function (req, res) {
connection.query('select * from todos where Serial_no=?', [req.params.id], function (error, results) {
if (error) throw error;
res.end(JSON.stringify(results));
});
});
app.post('/todos/add', (req, res) => {
const Serial_no = req.body.Serial_no;
const todo_description = req.body.todo_description;
const todo_responsible = req.body.todo_responsible;
const todo_priority = req.body.todo_priority;
const todo_completed = req.body.todo_completed;
console.log(Serial_no, todo_description, todo_responsible, todo_priority, todo_completed);
const insertQuery = 'INSERT INTO todos (todo_description,todo_responsible,todo_priority,todo_completed) VALUES (?)';
connection.query(insertQuery, [[todo_description, todo_responsible, todo_priority, todo_completed]],
(err, result) => {
if (err) {
res.send(err)
}
else
res.status(200).send({
data: result, message: 'data have been added sucessfully.'
});
}
)
});
/*
app.post('/edit', (req, res) => {
connection.query('UPDATE todos SET todo_completed = ? WHERE Serial_no = ?', [todo_completed], function (error, results, fields) {
(err, result) => {
if (err) {
res.send(err)
}
console.log(result);
res.send({
data: result, message: 'data have been updated sucessfully.'
});
}
)
}
});
*/
app.post('/todos/update/:id',(req, res) => {
const Serial_no = req.body.Serial_no;
const todo_description = req.body.todo_description;
const todo_responsible = req.body.todo_responsible;
const todo_priority = req.body.todo_priority;
const todo_completed = req.body.todo_completed;
console.log(Serial_no, todo_description, todo_responsible, todo_priority, todo_completed);
connection.query('UPDATE todos SET todo_completed = ? WHERE Serial_no = ?', [todo_completed, Serial_no],
//const updateQuery =('UPDATE todos SET todo_description = ?, todo_responsible = ?, todo_priority = ?, todo_completed = ? WHERE Serial_no = ?',
//connection.query(updateQuery,{Serial_no: "", todo_description: "",todo_responsible: "",todo_priority: "",todo_completed: ""},
//connection.query('UPDATE todos SET todo_description = ?, todo_responsible = ?, todo_priority = ?, todo_completed = ? WHERE Serial_no = ? :Serial_no',
//{Serial_no: Serial_no, todo_description: todo_description,todo_responsible: todo_responsible,todo_priority: todo_priority,todo_completed: todo_completed});
//connection.query(updateQuery, [[Serial_no,todo_description, todo_responsible, todo_priority, todo_completed]],
(err, result) => {
if (err) {
res.send(err)
}
else
res.status(200).send({
data: result, message: 'data have been updated sucessfully.'
});
}
)
});
app.use('/todos', todoRoutes);
app.listen(PORT, function () {
console.log("Server is running on Port: " + PORT);
});
В бэкэнде я также попытался разделить программу на три части 1.config => connection. js
var mysql = require('mysql');
var express = require('express');
var bodyParser = require('body-parser');
var connection = require('./backend/config/connection');
var routes = require('./backend/controllers/routes');
var app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
connection.init();
routes.configure(app);
function Connection() {
this.pool = null;
this.init = function() {
this.pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: 'system',
database: 'db'
});
};
this.acquire = function(callback) {
this.pool.getConnection(function(err, connection) {
callback(err, connection);
});
};
}
module.exports = new Connection();
2.controllers => route. js
var todo = require('../models/todo');
module.exports = {
configure: function(app) {
app.get('/todo',function(req,res) {
todo.get(res);
});
app.get('/todo/:id',function(req,res) {
todo.getByID(req.params.id,res);
});
app.post('/todo',function(req,res) {
todo.create(req.body,res);
});
app.put('/todo/:id',function(req,res) {
todo.update(req.body.name,req.params.id,res);
});
app.delete('/todo/:id',function(req,res) {
todo.delete(req.params.id,res);
});
}
};
3.models => todo. js
var connection = require ('../config/connection');
function Todo() {
this.get = function(res) {
connection.acquire(function(err,con) {
con.query('select * from todos', function(err,result) {
con.release();
res.send(result);
console.log("Get successful");
});
});
};
this.getByID = function(id,res) {
connection.acquire(function(err,con) {
con.query('select * from todos where Serial_no = ?', id, function(err,result) {
con.release();
res.send(result);
console.log("Get by ID successful");
});
});
};
this.create = function(todo,res) {
connection.acquire(function(err,con) {
con.query('insert into todos set ?', todo, function(err,result) {
con.release();
if (err) {
res.send({status:1, message:'TODO creation fail'});
} else {
res.send({status:0, message:'TODO create success'});
console.log("Post successful");
}
});
});
};
this.update = function(todo,id,res) {
connection.acquire(function(err,con) {
con.query('update todos set todo_completed = ? where Serial_no = ?', [todo, id], function(err,result) {
con.release();
if (err) {
res.send({status:1, message:'TODO update fail'});
} else {
res.send({status:0, message:'TODO update success'});
console.log("Put successful");
}
});
});
};
this.delete = function(id,res) {
connection.acquire(function(err,con) {
con.query('delete from todos where Serial_no = ?', id, function(err,result) {
con.release();
if (err) {
res.send({status:1, message:'TODO delete fail'});
} else {
res.send({status:0, message:'TODO delete success'});
console.log("Delete successful");
}
});
});
};
};
module.exports = new Todo();