发布具有奇怪行为的请求

Posted

技术标签:

【中文标题】发布具有奇怪行为的请求【英文标题】:Post request with strange behavior 【发布时间】:2021-05-26 04:49:13 【问题描述】:

我设置了一个节点/快递服务器,它与一个 mysql 数据库通信(两者都托管在 AWS 上,分别在弹性 beanstalk 环境和 RDS 实例中)。我在 react 中创建了一个简单的创建帐户身份验证项目,我目前正在本地运行。我通过发布请求与服务器通信。

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 打开日志以检查服务器在做什么,但没有打印出任何我期望的结果。我的新帐户信息没有打印(通常是),也没有打印错误。这是一个令人头疼的问题。是否有某种原因我的帖子请求不会到达我的服务器,但只是部分时间?我很茫然……

我完全在本地环境中运行应用程序(将请求更改为本地服务器,而不是托管在弹性 beanstalk 上的服务器)。这在 100% 的时间内都有效(请注意,这是完全相同的服务器代码)。我对这种行为感到困惑,这显然与 AWS 中弹性 beanstalk 上的托管版本有关。是什么导致了这种行为,我该如何解决?

我切换回托管服务器进行进一步测试。我只是创建帐户的垃圾邮件,看看我是否能注意到任何模式。该应用程序大约每 5 次创建一个成功的帐户。其他四次它不会将任何信息保存到数据库中。我的字段数据没有问题(我已经实现了一些错误检查),因为我只是一遍又一遍地发送相同的信息,直到它最终创建。它最终会,但只是在大约 4 次尝试之后。

以下是我添加了 connection.end() 的发布请求,以及我最初按照 cmets 中的请求连接到我的数据库的位置。

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();
    
  );
);

【问题讨论】:

【参考方案1】:

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')
    
)

【讨论】:

感谢您的建议。我尝试了这两件事。不幸的是,有些东西仍然无法正常工作。在检查来自 AWS 的日志后,我的发布请求似乎甚至没有到达我的服务器路由(在它不起作用的实例期间)。最奇怪的是,我还有另一个帖子请求编辑帐户信息。这个一直有效。我比较了每个的代码,我没有区别。我不明白为什么一个有效而另一个无效。 我不知道来自 .then 或 res.end 的信息是否不打印各自的信息是否重要。 另外,我希望您尝试添加connection.end() 部分,就像我在编辑中显示的那样。请观察浏览器开发者工具的网络标签,查看每个请求的状态及其输出。您能否还包括创建 mysql 连接的服务器端代码。 我在上面的帖子中添加了带有connection.end的post请求,以及我与数据库的初始连接。我目前处于没有功能的状态。当我从 AWS 打印日志时,服务器甚至没有成功连接到数据库。 connection.end() 似乎搞砸了。我是不是用错了? 是的,它确实造成了麻烦。因为您的连接是在快速服务器启动时创建的,我们在查询中将其关闭。因此该连接不可用于后续查询。暂时删除它。你有没有检查浏览器的开发者工具,观察请求成功和失败的场景。

以上是关于发布具有奇怪行为的请求的主要内容,如果未能解决你的问题,请参考以下文章

请求 ProcessBasicInformation 时 ZwQueryInformationProcess 的奇怪行为

iOS javascript POST请求奇怪的行为

在 Nuxt.js 中请求奇怪的行为

使用多线程处理多个http请求HttpListener导致奇怪的行为

ExtJS 4 奇怪的树加载行为

Eureka 注册了奇怪的 IP 地址并且请求无法使用 zuul