#困っていること
AWSのEC2でwebサーバー(apache)から、異なるサブネット上にmysqlをインストールしたDBサーバー対して、データ登録や取得が成功しません。
問題点など教えていただければ幸いでございます。2020年中に解消したいです...皆様どうかお願いいたします!
#エラー
下記エラーがchromeのコンソールに表示されています。
①下記のフロントエンドのソースコードの17行目で発生 Error: Network Error at e.exports (createError.js:16) at XMLHttpRequest.p.onerror (xhr.js:84)
②こちらのエラーはyu_1985さんのご回答より解決しました。ありがとうございました。 xhr.js:177 GET http://localhost:9000/api/get net::ERR_CONNECTION_REFUSED
③新しいエラー(2021/1/1追記) net::ERR_CONNECTION_TIMED_OUT
#環境、コード
●サーバーOS: amazon linux2
●フロントエンド
webサーバーの/var/www/htmlにyarn build
したコードを配置。ブラウザからwebサーバーにアクセスするとUIが表示される状態。
import React,{useState,useEffect} from 'react'; import AxiosBase from 'axios'; import { Link } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import TodoList from './todoList'; const InputForm = () => { const Axios = AxiosBase.create({ baseURL:"http://ec2-13-115-56-254.ap-northeast-1.compute.amazonaws.com:9000", header:{'X-Requested-With': 'XMLHttpRequest'} }) const {register,handleSubmit,reset} = useForm(); const [todoList,setTodoList] = useState([]); const [newTask,setNewTask] = useState([]); useEffect(() => { Axios.get('/api/get') .then((response) =>{ setTodoList(response.data) }) .catch((err) => console.log(err)); },[newTask.length]) const onSubmit = async (data) => { const {task} = data; setNewTask([ ...newTask, task ]); Axios.post('/api/insert',{ task:task, }).then((result) => console.log('成功')) .catch((err)=>console.log(err)); reset(); } return( <> <Link to='/'>Home</Link> <form onSubmit={handleSubmit(onSubmit)}> <input type="text" name='task' ref={register}/> <button>追加</button> </form> <TodoList todoList={todoList}/> </> ) } export default InputForm;
"@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", "axios": "^0.21.1", "react": "^17.0.1", "react-dom": "^17.0.1", "react-hook-form": "^6.13.1", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-scripts": "4.0.1", "web-vitals": "^0.2.4"
●バックエンド
expressで構築。
const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const path = require('path'); const mysql = require('mysql'); const app = express(); app.use(express.static(path.join(__dirname,'build'))); app.get('/*',(req,res) => { res.sendFile(path.join(__dirname,'build','index.html')); }); const db = mysql.createPool({ host:'ip-10-0-24-237.ap-northeast-1.compute.internal', user:'guestuser', password:'**********', database:'todolist' }) app.use(cors()); app.use(express.json()); app.use(bodyParser.urlencoded({extended: true})); app.post('/api/insert', (req, res) => { const task = req.body.task; console.log(req.body); const sqlInsert = "INSERT INTO tasks (task) VALUES (?);"; db.query(sqlInsert,[task],(err,result) => { console.log('insert success'); }) }) app.get('/api/get',(req,res) => { const sqlSelect = 'SELECT * FROM tasks;'; db.query(sqlSelect,(err,result) => { res.send(result); }) }) app.delete('/api/delete/:id',(req,res) => { const id = req.params.id; const sqlDelete = 'DELETE FROM tasks WHERE id = ?;' db.query(sqlDelete,[id],(err,result) => { if (err) console.log(err); }) }) app.listen(9000,() => { console.log(`port 9000`) });
#試したこと、確認したこと
・上記バックエンドのcreatePoolで、hostにDBサーバーのdns名を指定。
ちなみに、ローカルの開発環境ではhostにlocalhost、userにrootを指定しており、データベースへのCRUDはうまくいっていました。
・DBサーバーのポート3306は開放できている。
$ sudo lsof -i -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 369 mysql 32u IPv6 57675 0t0 TCP *:33060 (LISTEN) mysqld 369 mysql 34u IPv6 57680 0t0 TCP *:3306 (LISTEN)
・自宅のネットワーク環境は問題なし
・webサーバー間の通信も問題なし。pingにて確認。
回答1件
あなたの回答
tips
プレビュー