【问题标题】:Using NodeJs with React将 NodeJ 与 React 结合使用
【发布时间】:2018-10-25 18:57:48
【问题描述】:

在 React 中使用 NodeJs 的正确方法是什么?

目前我正在运行Node on port 3000React on port 3001

现在,我的节点我有这条路线

app.get("/", (req, res) => {
  console.log(req.user)
 res.json(req.user)
})

这里console.log 在我手动转到localhost:3000 时显示用户详细信息,但是如果我从对上述给定网址的反应中发出 axios 请求,它会显示未定义。

  componentWillMount() {
             axios.get("http://localhost:3000/").then(response => {
                 console.log(response)
             }).catch(error => {
                 console.log(error)
             })
        }

现在,req.user 是从护照谷歌战略和我获得的,因为来自 localhost:3000 的日志显示了数据,而来自 localhost:3001 的日志没有显示数据。

如果我以正确的方式使用节点,我会感到困惑吗?即通过axios发送请求并通过res.json获取数据

此外,由于大部分教程或我遵循的教程都使用 EJS 而不是 React,而用户大多使用 res.render

我只是想知道 res.render 在 NodeJS 中的等效性

[更新:]我正在通过谷歌浏览器中的插件启用跨源资源共享

【问题讨论】:

  • 您正在发出跨域请求 (CORS),端口 3001 与 3000。如果您在 Chrome 中检查控制台,它将向您显示警告,即数据将在返回给您之前被清除。
  • @croraf 我正在通过谷歌浏览器中的插件启用跨源资源共享
  • 您使用正确。事实上,这与 React 无关。你只是错过了一些关于 CORS 的东西。我最近遇到了同样的问题,当浏览器中返回的数据设置为未定义时,节点正在发送正确的数据。你在 node 中使用 koa 吗?
  • 你使用 create-react-app 吗?
  • @croraf 不。谷歌搜索 koa

标签: javascript node.js reactjs


【解决方案1】:

编辑:在与 OP 的讨论中,我发现这很可能是与护照身份验证中间件相关的问题。原始答案如下。


看起来像一个 CORS 问题,因为您的前端提供服务器位于端口 3001 上,后端位于 3000 上。我可以向您展示我使用它的方式(在 react+node CORS 设置中,尽管问题无关使用 React)并且我没有 CORS 问题:

在前端我使用本机浏览器的获取:

const fetchRelative = async (path, options) => {

    const url = new URL('http://localhost:3000/' + path);

    return await ((await fetch(url, options)).json());
};

这里使用了 async/await 语法。我正在使用 babel 进行转译,但也许浏览器本身就支持。

提供的获取选项例如:

{
  method: 'POST',
  body: JSON.stringify(order),
  headers: {
    'Content-Type': 'application/json',
     'Accept': 'application/json'
  }
};

对于简单的 get 请求,您可以将 options 参数留空。


在后端(节点+koa 服务器)我使用这个:

const Koa = require('koa');
const koaBody = require('koa-body');
const cors = require('koa-cors');

const startServer = (port) => {

    const server = new Koa();

    server.use(cors({ origin: '*', allowMethods: ['GET', 'POST', 'DELETE', 'PUT', 'OPTIONS'] }));

    server.use(koaBody());    
    
    server.use(bindRoutes());
    
    server.listen(port);
};

快递服务器(https://expressjs.com/en/resources/middleware/cors.html)基本相同。

bindRoutes 只是将 koa-router 配置提取到一个单独的文件中:

const Router = require('koa-router');
const bindRoutes = () => {
    const router = new Router();

    router.get('restaurants', async (ctx) => {
        ctx.body = 'abc;
    });

    return router.routes();
};

这里没有使用CORS插件。

附言

async/await 说明和浏览器支持状态 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

获取解释和浏览器支持状态 https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

【讨论】:

  • 非常感谢您的回答,我正在阅读有关 koa 的信息,另外,我使用 axios 而不是 Fetch,并且由于 axios 返回承诺,我想我可能不需要异步?
【解决方案2】:

您可以在不同的端口上同时运行 Node 服务器和 React 应用程序,并将 React 应用程序代理回您的 Node 服务器。这可以在没有 CORS 插件的情况下完成。关于如何设置的更多细节在这里:https://medium.freecodecamp.org/how-to-make-create-react-app-work-with-a-node-backend-api-7c5c48acb1b0

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2023-03-18
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 2018-05-18
相关资源
最近更新 更多