【问题标题】:React component events not working on NodeJs+Express serverReact 组件事件在 NodeJs+Express 服务器上不起作用
【发布时间】:2017-06-18 21:15:27
【问题描述】:

我们首次使用 MERN 堆栈构建项目。这是一个站立和复古应用程序。问题是我们的 react 组件事件在服务器端不起作用,但在客户端却完美运行。基本上,我们可以使用 React 提供静态页面,但不能使用 Node 和 Express 作为服务器时更新和保存状态的动态页面。非常感谢修复此块的任何帮助。

我们已经用react-app 初始化了我们的项目。 我们的 package.json 看起来像这样: { "name": "standup", "version": "0.1.0", "private": true, "devDependencies": { "babel-cli": "^6.22.2", "babel-core": "^6.22.1", "ejs": "^2.5.5", "express-react-engine": "^0.6.0", "express-react-views": "^0.10.2", "http-server": "^0.9.0", "mocha": "^3.2.0", "react-router": "^3.0.2", "react-scripts": "0.8.5", "should": "^11.2.0", "supertest": "^3.0.0" }, "dependencies": { "body-parser": "^1.16.0", "express": "^4.14.1", "react": "^15.4.2", "react-addons-test-utils": "^15.4.2", "react-dom": "^15.4.2" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } } 当我们运行 npm start 并访问 localhost:3000 时,我们会得到这个动态更新的视图: client side rendering screenshot

当我们使用nodemon --exec babel-node --presets 'react,es2015' src/server.js 打开节点服务器时,所有按钮都不起作用。

“网络”选项卡中唯一明显的区别是 Bundle.js。服务器端没有加载哪个。

This is our Express server:
import path from 'path';
import {Server} from 'http';
import Express from 'express'
import React from 'react';
import { renderToString } from 'react-dom/server';
import HomePage from './components/HomePage'
import RetroPage from './components/RetroPage'
import StandupPage from './components/StandupPage'


const app = new Express();
const server = new Server(app);

app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
console.log(path)

app.use(Express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
  let markup = renderToString(<HomePage />)
  res.render('index', {markup});
});

app.get('/standup', (req, res) => {
  let markup = renderToString(<StandupPage/>)
  res.render('index', {markup})
})

app.get('/retro', (req, res) => {
  let markup = renderToString(<RetroPage/>)
  res.send(markup);
})

const port = process.env.PORT || 3000;
const env = process.env.NODE_ENV || 'production';
server.listen(port, err => {
  if (err) {
    return console.error(err);
  }
  console.info(`Server running on http://localhost:${port} [${env}]`);
})

我没有在这里展示 React 组件,因为我们知道它们在客户端工作得很好。

当我们发送请求但无法解决问题时,我们认为我们在 Express 路由中遗漏了某些内容。

谢谢!

【问题讨论】:

  • 我不确定我是否遵循您的操作。您是否尝试进行服务器端渲染?你确定要通过 react-router 从一个页面移动到另一个页面吗?我只见过像下面这样的 React 项目:前端的 React 和一个由 React 项目调用的 Node/Express REST API .

标签: node.js reactjs express events serverside-javascript


【解决方案1】:

感谢您的反馈。我们真的很感激。

我们分析了您的回答并考虑了它们。

但是在我们的教练 Mary 的帮助下,我们意识到我们不需要在我们的视图模板中使用我们的 Javascript 代码,index.ejs 在服务器端。

我们省略了一个简单的错误,因为当您在客户端使用 React 使用 index.html 进行渲染时,您不需要在所有 Javascript 代码中包含 &lt;script&gt; 标记。

所以我们安装了 Webpack 来捆绑使用 Babel 编译的模块,因为我们使用的是最新的 ES6 语法。愿代码之神原谅我们的这个错误 :) 但这是我们第一次使用像 MERN 这样的全新技术堆栈以及其他几个 中间件 做一个如此复杂的项目strong> 和库。

我猜 Rails 完全是固执己见,但 NodeJs + ExpressJs...让我们说这是一个有趣的 :)

另外,自从 2 天前首次发布以来,我们实现了更多技术,如 Websockets 并添加 MongoDB 作为我们的数据库,所以现在我们的代码更多复杂的。我差点忘记了,我们还在 Heroku 上部署了我们的应用程序(我会在 2 月 10 日星期五完成后发布链接。

项目结束后,我将发布 Github 存储库。这是一个很酷的 Standups and Retros 应用程序 :) 现在我们甚至在谈论 Flux

这是一个新的架构,将取代 MVC 图例,至少在某些情况下以及在某些公司(例如 Facebook)中是这样吗?

我想我们会看到的!

【讨论】:

    【解决方案2】:

    正如您所说,您的服务器渲染视图是 STATIC - 纯标记,只是文本。这就是renderToString 所做的。这些页面仍然需要在客户端合并 JS 才能处理事件。

    另一种解决方法是将事件处理程序中的所有代码作为匿名函数直接写入道具。这是不好的做法。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2018-05-15
      • 2019-03-30
      • 2021-05-07
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多