package.json中的代理不影响获取请求

Rad*_*nov 11 api proxy request node.js reactjs

我试图使用React从开发服务器获取一些数据.

我正在运行客户端localhost:3001和后端port 3000.

获取请求:

 const laina = fetch('/api/users');
    laina.then((err,res) => {
      console.log(res);
    })
Run Code Online (Sandbox Code Playgroud)

当我运行我的开发服务器和webpack-dev-server时,我得到以下输出:

GET http://localhost:3001/api/users 404 (Not Found)
Run Code Online (Sandbox Code Playgroud)

我尝试在package.json中指定代理,以便将请求代理到API服务器,但是没有任何改变.

这是我的package.json文件:

在此输入图像描述

..和webpack.config: 在此输入图像描述

请告诉我,如果你需要从我的项目中看到其他任何东西.我道歉,如果我遗漏了一些东西并且没有彻底,我仍然很擅长使用这些技术.

Shu*_*tri 11

您可以修改获取请求API网址以提供完整的主机名

 fetch('http://localhost:3000/api/users') 
Run Code Online (Sandbox Code Playgroud)

还要确保CORS在后端启用了

如果您想thourgh的WebPack重定向,你可以尝试devServer.proxy

devServer: { 
    inline: true, 
    contentBase: './dist', 
    port: 3001, 
    proxy: { "/api/**": { target: 'http://localhost:3000', secure: false }  }
 }
Run Code Online (Sandbox Code Playgroud)

  • 您永远不要启用cors。 (4认同)
  • @AakashVerma,我不完全同意您的评论,当您需要将数据提供给不同域上的前端时,您需要启用 cors,但是,我同意您可能希望在域上放置过滤器你信任 (2认同)

Can*_*nis 9

我知道我在这里玩游戏有点晚了,但我会把它留在这里以供将来参考。

要使 devServer 代理按预期工作,您需要将 HTTP Accepts 标头指定为“text/html”以外的其他内容。使用 fetch 接受作为第二个参数的 init-object 来执行此操作。一个简单的例子:

fetch("/api/profile",{
    headers:{
        "accepts":"application/json"
    }
})
.then(res => {
    console.log(res);
    return res.json();
})
.then(json => console.log(json) )
.catch( a => { console.log(a) });
Run Code Online (Sandbox Code Playgroud)

这样做的原因是 WebPack Dev Server 通常使用上下文/命名空间来区分要提供的内容和要转发的内容。create-react-app 脚本不会从package.json文件中的代理路径中提取命名空间。相反,脚本具有自以为是的默认行为,即使用 HTTP GET 以外的任何请求都将被转发。此外,任何使用 HTTP GET 但不是text/html作为Accepts标头的内容都将被转发。

原因是大多数 React 应用程序都是 SPA(单页应用程序),它们使用 AJAX/Fetch 与某些 API 进行通信。API 通常使用 JSON 或 XML,但不使用text/html.


Beg*_*ner 5

在 package.json 中

"proxy": {
    "/api/users": {
        "target": "http://localhost:3000"
    }
},
Run Code Online (Sandbox Code Playgroud)

  • 出现错误:`指定时,package.json 中的“proxy”必须是字符串。相反,“代理”的类型是“对象”。从 package.json 中删除“proxy”,或者将其设为字符串。 (3认同)