我正在创建一个发布应用程序,该应用程序需要使用React和MySQL数据库之间的通信来回发送信息。使用Express作为我的JS服务器。服务器代码如下:
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const cors = require('cors');
const connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'ArticleDatabase',
port: 3300,
socketPath: '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock'
});
// Initialize the app
const app = express();
app.use(cors());
appl.post('/articletest', function(req, res) {
var art = req.body;
var query = connection.query("INSERT INTO articles SET ?", art,
function(err, res) {
})
})
// https://expressjs.com/en/guide/routing.html
app.get('/comments', function (req, res) {
// connection.connect();
connection.query('SELECT * FROM articles', function (error, results,
fields) {
if (error) throw error;
else {
return res.json({
data: results
})
};
});
// connection.end();
});
// Start the server
app.listen(3300, () => {
console.log('Listening on port 3300');
});
我的React类如下:
class Profile extends React.Component {
constructor(props) {
super(props);
this.state = {
title: '',
author: '',
text: ''
}
}
handleSubmit() {
// On submit of the form, send a POST request with the data to the
// server.
fetch('http://localhost:3300/articletest', {
body: JSON.stringify(this.state),
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'content-type': 'application/json'
},
method: 'POST',
mode: 'cors',
redirect: 'follow',
referrer: 'no-referrer',
})
.then(function (response) {
console.log(response);
if (response.status === 200) {
alert('Saved');
} else {
alert('Issues saving');
}
});
}
render() {
return (
<div>
<form onSubmit={() => this.handleSubmit()}>
<input type = "text" placeholder="title" onChange={e =>
this.setState({ title: e.target.value} )} />
<input type="text" placeholder="author" onChange={e =>
this.setState({ author: e.target.value} )} />
<textarea type="text" placeholder="text" onChange={e =>
this.setState({ text: e.target.value} )} />
<input type="Submit" />
</form>
</div>
);
}
}
我在在线教程中找到了相当标准的东西。我可以搜索我的数据库并显示获取的信息没有问题,但是反之则不行。当我尝试从<form>
标记获取输入时,没有任何内容插入到数据库中,而是出现了此错误:
[Error] Fetch API cannot load
http://localhost:3000/static/js/0.chunk.js due to access control
checks.
Error: The error you provided does not contain a stack trace.
Unhandled Promise Rejection: TypeError: cancelled
我知道这与访问控制有关,但是由于我已经在使用cors并且可以成功从数据库中检索数据,所以我不确定自己在做什么错。任何建议将不胜感激。预先谢谢你。
答案 0 :(得分:3)
您需要先确认您的服务点已启用CORS,以找出问题所在。为了只专注于CORS功能,我会暂时删除MySQL代码。
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(cors());
app.get('/', function(req, res){
var root = {};
root.status = 'success';
root.method = 'index';
var json = JSON.stringify(root);
res.send(json);
});
app.post('/cors', function(req, res) {
var root = {};
root.status = 'success';
root.method = 'cors';
var json = JSON.stringify(root);
res.send(json);
})
// Start the server
app.listen(3300, () => {
console.log('Listening on port 3300');
});
您有一个服务器正在监听3300端口,请在终端上运行以下PREFLIGHT命令。
curl -v \
-H "Origin: https://example.com" \
-H "Access-Control-Request-Headers: X-Custom-Header" \
-H "Acess-Control-Request-Method: POST" \
-X OPTIONS \
http://localhost:3300
如果预检请求成功,则响应应包括Access-Control-Allow-Origin,Access-Control-Allow-Methods和Access-Control-Allow-Header
现在运行POST方法。
curl -v \
-H "Origin: https://example.com" \
-H "X-Custom-Header: value" \
-X POST \
http://localhost:3300/cors
如果发布请求成功,则响应应包括 访问控制允许来源
如果一切正常,则您的服务器正常。然后,您需要在iOS应用中尝试发布方法。
注意。我也会对在本地主机上使用cors感到怀疑。我会将127.0.0.1映射到一个域,然后让应用程序改用该域。如果您使用的是Linux或Mac,则可以修改/ etc / hosts。对于Windows,它是c:\ windows \ system32 \ drivers \ etc \ hosts
答案 1 :(得分:1)
尝试将发出请求的服务器明确列入白名单:
const whitelist = ['http://localhost:3000']; // React app
const corsInstance = cors({
origin: (origin, callback) => {
if (!origin || whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
});
application.use(corsInstance);
https://expressjs.com/en/resources/middleware/cors.html#configuring-cors-w-dynamic-origin
答案 2 :(得分:0)
您需要在event.preventDefault()
方法的末尾添加handleSubmit
(请检查此示例https://stackblitz.com/edit/react-forms)。
您必须这样做,以防止在提交时出现表单默认行为:它会尝试将数据同步发送到加载的网址(因为上面没有action
属性)。
答案 3 :(得分:0)
对于那些可能遇到类似问题的人,我能够通过完全转储快速服务器来解决此问题。我只是使用Apache服务器上的.php文件将数据插入数据库中。希望对别人有帮助。