【解决使用fetch发送json格式的post请求报错问题】

解决使用fetch发送json格式的post请求报错问题:

今天,在使用Fetch用法以 POST请求方式的参数传递时,可传输的数据格式有 x-www-form-urlencoded 和 json 两种。以 x-www-form-urlencoded 格式传参时,可以正常得到后台响应的数据,但是 以 json 格式传输时出现报错。先记录解决此问题的过程。


代码:

使用 Fetch 以 json 格式的 post请求代码如下

fetch('http://localhost:3000/books', {
      method: 'post',
      body: JSON.stringify({
        uname: '张三',
        pwd: '456'
      }), // 请求参数,JSON.stringify() JS 数据对象转换为 JSON 字符串
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then(function (data) {
        return data.text();
      }).then(function (data) {
        console.log(data)
      });

后台关于解决跨域访问的请求头设置

// 设置允许跨域访问该服务
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");  // 允许访问该资源的外域 URL。*允许来自任何域的请求
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "X-Requested-With"); // 额外的请求头进行声明, 允许客户端向服务器发送X-Requested-With的请求头信息
  res.header('Access-Control-Allow-Headers', 'Content-Type'); // 允许客户端向服务器发送Content-Type的请求头信息
  res.header('Access-Control-Allow-Headers', 'mytoken');
  next();
});
// POST请求接口
app.post('/books', (req, res) => {
  res.send('POST请求传递参数!' + req.body.uname + '---' + req.body.pwd)  // body-parser 中间件提供的 body 属性
})

报错提示:

报错图

解决方案:

方案1. 注释掉跨域里请求头设置中有mytoken那一行。

方案2. 把请求头中 Access-Control-Allow-Headers 中的内容合并为一行。

代码如下

  1. 方案1代码:
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");  // 允许访问该资源的外域 URL。*允许来自任何域的请求
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "X-Requested-With"); // 额外的请求头进行声明, 允许客户端向服务器发送X-Requested-With的请求头信息
  res.header('Access-Control-Allow-Headers', 'Content-Type'); // 允许客户端向服务器发送Content-Type的请求头信息
  // res.header('Access-Control-Allow-Headers', 'mytoken');
  next();
});
  1. 方案2代码:
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");  // 允许访问该资源的外域 URL。*允许来自任何域的请求
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,mytoken"); // 额外的请求头进行声明, 允许客户端向服务器发送X-Requested-With,Content-Type,mytoken的请求头信息
  next();
});

修改后运行成功

  1. 使用方案1解决后访问成功

修改后运行结果

  1. 使用方案2解决后访问成功

成功

总结:

按照上述方法解决了使用fetch发送json格式的post请求报错问题,但关于为什么以这种方式可以访问成功的原理还没有深入研究,在此仅记录此次解决的方案,在后续的学习中对于原因还需要进行更多的学习。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: axios发送post请求报错500是因为服务器内部出现了错误,导致无法正常处理请求。可能是服务器代码出现了bug,或者是服务器配置不正确等原因导致的。需要检查服务器端的日志,查找具体的错误信息,然后进行相应的修复。同时,也可以尝试使用其他方式发送请求,比如使用fetch或者XMLHttpRequest等,看看是否能够正常处理请求。 ### 回答2: 当使用axios发送post请求时,如果返回的状态码是500,这意味着服务器在处理请求时出现了错误。这可能是由于各种原因造成的,例如服务器端的代码错误、服务器资源不足、数据库连接错误等。 首先,我们可以确保我们的请求参数是正确的并可以被服务器正确处理。我们可以通过打印日志来检查发送请求和服务器返回的错误信息。如果我们的请求参数不正确或者格式不正确,服务器可能会返回一个500状态码。 其次,我们需要检查服务器端的代码是否正确。我们可以查看服务器端的日志文件或者调试工具来确定错误发生的位置。如果是服务器端代码问题,我们需要对代码进行修复或升级,然后重新部署服务器。 另外,服务器资源也可能是导致500错误的原因之一。我们可以检查服务器的资源使用情况,并增加服务器的内存、硬盘等配置以提高服务器的处理能力。 最后,我们可以尝试使用其他工具(如Postman)来发送相同的请求,以确定是否是axios本身的问题。如果仍然存在问题,我们可以尝试升级axios或者联系axios开发者团队来解决问题。 总之,当axios发送post请求返回500状态码时,我们需要仔细检查请求参数、服务器端代码、服务器资源等方面,以找到并修复错误。 ### 回答3: Axios是一个流行的基于Promise的HTTP客户端,用于在浏览器和Node.js中进行请求。而当通过Axios发送POST请求时,有时候会出现500错误的情况。那么,我们该如何解决这个问题呢? 首先,需要了解“500”是服务器内部错误的 HTTP 状态代码,这表示服务器在处理请求时遇到问题。错误的原因可能是多方面的,例如服务器上的代码出现错误、服务器配置不正确或服务器资源耗尽等。 接下来,我们可以尝试进行以下几个步骤来解决这个问题: 1. 检查请求URL是否正确 首先,我们要确认API请求的URL是否正确。如果URL地址拼写错误或找不到资源,就会出现500错误。 2. 检查服务器端的API是否出错 如果请求URL没有问题,那么就要检查服务器端的API是否出错。可以通过在开发人员工具中查看响应内容或在控制台中打印一些输出信息来获取更多信息。 3. 检查请求参数是否正确 发送POST请求时,需要将数据作为payload数据(也就是请求体)发送给服务器。因此,也需要检查请求参数是否正确。可以使用Postman等工具模拟请求,检查请求参数是否与服务器预期的一致。 4. 检查请求头是否正确 有时,服务器需要在请求头中添加一些自定义的请求头(例如安全访问令牌或其他标识符)。因此,需要检查请求头是否正确设置。 通过以上步骤,可以解决大部分POST请求返回500错误的问题。如果问题仍然存在,可以尝试询问服务器管理员或开发人员是否有其他因素导致的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值