使用 Node 运行的 POST 请求和使用 React/Chrome 发送的请求有啥区别?

Posted

技术标签:

【中文标题】使用 Node 运行的 POST 请求和使用 React/Chrome 发送的请求有啥区别?【英文标题】:What's the difference between a POST request run with Node and a request sent with React/Chrome?使用 Node 运行的 POST 请求和使用 React/Chrome 发送的请求有什么区别? 【发布时间】:2018-09-21 22:35:26 【问题描述】:

我正在测试 Robinhood API,我需要做的第一件事是使用 API 登录。运行 node login.js 时,我可以使用以下代码登录

var axios = require('axios')
axios.post('https://api.robinhood.com/api-token-auth/', 
      username: 'email@email.com',
      password: '********'
    , 
       headers: 'Access-Control-Allow-Origin': '*'
    ).then(function (response) 
        console.log(response.data);
    )

但是,当我在浏览器中使用 React 尝试相同的代码时,我收到了 No 'Access-Control-Allow-Origin' 错误。如果我在 Chrome 中启用Access-Control-Allow-Origin,则不会出现错误,我可以登录。

我已经包含了Access-Contrl-Allow-Origin 标头。问题似乎是 Node 和 React/Chrome 之间的差异?

是什么让代码可以在 Node 上运行,但不能在 React/Chrome 上运行?

【问题讨论】:

节点不是浏览器,因此不受 CORS 约束。 您是否在服务器端启用了 CORS? enable-cors.org/server.html 不要在请求中发送响应头 【参考方案1】:

浏览器在 POST 请求之前发送一个安全强制的 OPTIONS 请求,以确定它所请求的服务器是否打算从浏览器当前所在的域接收请求。浏览器拒绝通过使用适当的 Access-Control* 标头响应 OPTIONS 请求来向未选择加入流量的服务器发送请求。

从节点repl运行没有这个限制。

这个问题更详细:How does the Chrome browser decide when to send OPTIONS?

【讨论】:

以上是关于使用 Node 运行的 POST 请求和使用 React/Chrome 发送的请求有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

带有预检的 Node.JS 中的跨域 POST 请求?

使用node-http-proxy POST,PUT请求报‘socket hang up’错误

node10---GET请求和POST请求的参数

Node.js使用Express实现Get和Post请求

从 Node.js POST 到 PHP

在 Node.js 中使用 POST 请求上传文件