当前位置: 首页 > 知识库问答 >
问题:

无法从浏览器发送json到Express服务器[复制]

卢涵畅
2023-03-14

我建立了两台服务器:第一台用于前端(localhost:7200),第二台用于后端(localhost:7300)。相应地,在路由“/test”上,前端到后端发出了一个测试请求。

问题在于,当我发送一个json对象(单击“btn”按钮时)时,它会拒绝,并显示以下消息:

CORS策略阻止从http://localhost:7300/testhttp://localhost:7200访问XMLHttpRequest:对预试请求的响应不通过权限改造检查:请求的资源上不存在访问控制允许起源标头。

当然,我在后端设置了“Access Control Allow Origin”头(见下文)。

如果我将“Content Type”头设置为“application/json”,就会发生这种情况。但是,如果根本没有设置头,或者头是“application/x-www-form-urlencoded”(因此,发送的消息与JSON不同),那么它就可以正常工作。

前端的代码

btn.addEventListener('click', () => {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'html" target="_blank">http://localhost:7300/test', true);
    xhr.setRequestHeader('Accept', 'application/json');
    xhr.setRequestHeader('Content-Type', 'application/json');

    xhr.addEventListener('load', (e) => {
      console.log(e.target.responseText);
    });

    xhr.send(JSON.stringify({name: 'kek'}))
});

后端上的代码:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json());

app.post('/test', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Headers', 'Content-Type')
  // res.set('Content-Type', 'application/json');
  res.header("Content-Type",'application/json');
  console.log(req.body)
  res.json({success: true});
});

共有2个答案

杭令
2023-03-14

您可以使用cors中间件。https://expressjs.com/en/resources/middleware/cors.html

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

此中间件自动设置标头以避免CORS问题(https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)。

常飞翼
2023-03-14

当服务器响应POST请求时,您正在设置头。

app.post('/test', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Headers', 'Content-Type')

错误消息显示:

对起飞前请求的响应没有通过权限改造检查

飞行前请求是一个选项请求,而不是POST请求,因此不会在对它的响应中设置标头,也不会发出POST请求。

使用标准的cors中间件库。不要重新发明轮子。

 类似资料:
  • 我正在开发一个基于云的后端HTTP服务,该服务将公开用于与一些on-prem系统的集成。客户机系统是由外部供应商定制的,它们是带有自己数据库的后端系统。这些系统部署在我们客户的公司中,我们无法访问它们,也无法控制它们。我们向供应商提供我们的API规范,他们实现客户机代码。 我的服务与客户交换的数据格式基于XML,并遵循一定的标准。供应商用不同的编程语言实现他们的客户机系统,随着时间的推移,新的供应

  • 到“ws://example.app:8080/”的WebSocket连接失败:在收到握手响应之前连接已关闭

  • 问题内容: 我将这些标头由服务器发送到客户端: 我希望客户端验证文件在服务器上没有更改,如果没有,则发送“ 200”。 Firefox发送: chrome为什么不刷新页面发送相同的消息?我追求的是.Net运行的行为: 问题答案: 以我的经验,您不仅需要“私有” Cache-Control标头。您需要“ Max-Age”或“ Expires”来强制Chrome重新验证服务器上的内容。 请记住,重新验

  • 我想用字符串格式的URL回复获取请求。我看到的示例看起来相当简单,但我相信我的cors中间件可能会搞糟一些事情。 这是我的服务器: 下面是我发送回复的地方: 我在前端看到一个响应,但它不包含URL字符串。以下是它的样子:

  • 我最近一直在用Java编写自己的Webserver,因为我觉得有一个很不错,昨天我偶然发现了一个问题,我仍然没有解决。我的浏览器(取消搜索Chromium)似乎向服务器发送了一些空请求或类似的东西。我实现了一个请求处理程序,它应该读取GET请求并提取请求的资源。它的工作原理是这样的:它以请求为例:“GET/index.htmlHTTP/1.1”并将其放入带有String.split (" ");

  • 问题内容: 最近5个小时,我一直在尝试将json对象发布到PHP脚本中。我已经阅读了所有文档,似乎代码应该可以,但事实并非如此。发出并接收到请求,但是我无法访问发布的json数据,甚至不知道它是否已正确发送。我不断得到一个空的php数组,而不是json数据。 这是php脚本(test.php) 我正在使用来自https://github.com/pokeb/asi-http- request.gi