我设置了一个节点/快速服务器,它正在与一个 mysql 数据库进行通信(这两个数据库都托管在 AWS 上,分别在弹性 beantalk 环境和 RDS 实例中)。我在 react 中创建了一个简单的 create account authentication 项目,目前正在本地运行。我通过发布请求与服务器通信。
createAccount = (event) => {
console.log("hello from createAccount");
const isValid = this.validate();
if (!isValid) {
console.log("not valid");
return false;
} else {
const formData = new FormData();
formData.append("firstName", this.state.firstName);
formData.append("lastName", this.state.lastName);
formData.append("username", this.state.username);
formData.append("passcode", this.state.passcode);
console.log(formData);
fetch("https://www.myurl.com/createUser", {
method: "POST",
headers: new Headers({
"Access-Control-Allow-Origin": "*",
}),
body: formData,
});
}
};
这里是服务器端代码:
var mysqlConnection = mysql.createConnection({
host: "my-endpoint",
user: "****",
password: "****",
port: "****",
database: "****",
});
app.post("/createUser", function (request, response) {
console.log("/createUser");
console.log(request.body);
const createUser = `CALL CreateUser('${request.body.firstName}', '${request.body.lastName}', '${request.body.username}', '${request.body.passcode}')`;
mysqlConnection.query(createUser, (error, result) => {
if (error) {
console.log(error);
} else {
console.log("SUCCESSFULLY CREATED A USER ACCOUNT");
response.set("Access-Control-Allow-Origin", "*");
mysqlConnection.end();
}
});
});
但是,我的帖子请求正在做一些奇怪的事情……大约有 2/3 的时间,一切都按预期进行。用户创建了一个帐户,信息成功添加到我的数据库中。但是,其余时间一切似乎都运行良好(通过检查我的 console.log 检查点),但是信息没有添加到我的数据库中...用户没有成功创建帐户。发生这种情况时,我从 AWS 打开日志以检查服务器正在执行的操作,但没有打印出我期望的任何内容。我的新账户信息没有打印出来(虽然通常是),也没有打印错误。这是一个令人头疼的问题。是否有某种原因我的帖子请求无法到达我的服务器,但只有部分时间?我不知所措...
我完全在本地环境中运行该应用程序(将我的请求更改为本地服务器,而不是托管在弹性 beantalk 上的服务器)。这在 100% 的情况下都有效(请注意,这是完全相同的服务器代码)。我对这种行为感到困惑,这显然与 AWS 中弹性 beantalk 上的托管版本有关。是什么导致了这种行为,我该如何解决?
我切换回托管服务器进行进一步测试。我只是创建帐户的垃圾邮件,看看我是否能注意到任何模式。该应用程序大约每 5 次创建一个成功的帐户。其他四次它不会将任何信息保存到数据库中。我的字段数据没有问题(我已经实现了一些错误检查),因为我只是一遍又一遍地发送相同的信息,直到它最终创建为止。最终成功,但仅在尝试了大约 4 次之后。
下面是我添加了 connection.end() 的帖子请求,以及我最初按照评论中的要求连接到我的数据库的位置。
var mysqlConnection = mysql.createConnection({
host: "my-endpoint",
user: "****",
password: "****",
port: "****",
database: "****",
});
app.post("/createUser", function (request, response) {
console.log("/createUser");
console.log(request.body);
const createUser = `CALL CreateUser('${request.body.firstName}', '${request.body.lastName}', '${request.body.username}', '${request.body.passcode}')`;
mysqlConnection.query(createUser, (error, result) => {
if (error) {
console.log(error);
} else {
console.log("SUCCESSFULLY CREATED A USER ACCOUNT");
response.set("Access-Control-Allow-Origin", "*");
mysqlConnection.end();
}
});
});
答案 0 :(得分:2)
fetch
函数返回一个承诺。因此您需要添加一个 .then
块。如果您不使用 .then
以下代码将不会等待提取完成。请检查并告诉我。
什么是承诺?一个 promise 最终会被解析并返回一个值,这与立即返回值的同步函数不同。
fetch('https://www.myurl.com/createUser', {
method: 'POST',
headers: new Headers({
'Access-Control-Allow-Origin': '*'
}),
body: formData
}).then(() => {
Console.log(‘done’)
})
我看到的第二个问题是您的服务器端快速端点 /createUser
应仅在 mysql 查询完成后完成。因此,您应该在查询完成后调用 res.end
来结束请求。以便前端在查询完成后从api获得响应。
mysqlConnection.query(createUser, (error, result) => {
if (error) {
console.log(error);
res.status(400).send(new Error('error result'));
} else {
console.log('created user');
res.send('success result')
}
})