2017-02-01 17 views
-1

初めてMERNスタックを使用してプロジェクトを構築しています。それはスタンドアップとレトロアプリです。問題は、私たちのコンポーネントイベントを反応させることがサーバー側では行われていないことです。しかし、クライアント側では完全に動作します。基本的にReactを使用して静的ページを提供することはできますが、Node & Expressをサーバーとして使用している状態を更新して保存する動的ページは動的には提供できません。このブロックを修正するための助けがあれば幸いです。NodeJs + 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を実行して、ローカルホストにアクセスしてください: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}]`); 
}) 

クライアント側で正常に動作していることがわかっているので、ここでリアクションコンポーネントを表示していません。

Expressルーティングではリクエストを送信しても指を置くことができないと考えています。

ありがとうございました!

+0

私はあなたがしたいことに従っているかどうかはわかりません。あなたはサーバー側のレンダリングをしようとしていますか?あなたはリアクション・ルータ経由でページ間を移動することを確実にしています...私はこれまでにReactプロジェクトを見たことがあります:フロントエンドのためのリアクションとReactプロジェクトによって呼び出されるNode/Express REST API 。 – Turtle

答えて

0

あなたのサーバーレンダリングビューは、あなたが言ったように、STATIC--純粋なマークアップ、テキストだけです。それはrenderToStringの機能です。これらのページでは、イベントを処理するためにJSをクライアント側に組み込む必要があります。

もう1つの方法は、イベントハンドラ内のすべてのコードを無名関数として直接propに書き込むことです。これは悪い習慣です。

0

ご意見ありがとうございます。私たちは本当にそれを感謝します。

あなたの回答を分析し、考慮しました。

私たちのコーチの助けを借りて、サーバー側のビューテンプレートindex.ejsにJavascriptコードを必要としていないことに気付きました。

index.htmlを使用してに反応しますが、クライアント側でレンダリングするとき、あなたはすべてのあなたのJavascriptコードを<script>タグを含める必要はありませんので、我々は省略簡単にエラーが発生しました。

だから我々は、我々は、最新のES6構文を使用しているためバベルでコンパイルされた当社のモジュールをバンドルするWebPACKのをインストールしました。コードの神がこの間違いを許してもいいかもしれません:)しかし、この複雑さのプロジェクトを、MERNといくつかの他のミドルウェアとライブラリのようなまったく新しいテクノロジスタックで初めてやっています。

私はRailsがは完全に独断ですが、NodeJs + ExpressJs ...ちょうどそれが楽しい1だと言う:)

ましょうプラス2日前だった初期のポスト、以来、私たちは実装推測ウェブサイトのようないくつかの技術があり、のMongoDBがデータベースとして追加されました。プロジェクトが終わったら、私はほとんど忘れてしまった、我々はまた、それは2月の金曜日10日に終了していますとき、(私はリンクを出してあげるHerokuの上で我々のアプリを展開。

私はGithubのレポを掲載します。それはですクールスタンドアップとレトロアプリ :)今は約フラックスについて話しています。

が、これは、少なくともいくつかの例では、そのようなFacebookのなど一部の企業では、MVC伝説に代わる新しいアーキテクチャですか?

私たちは見るでしょう!

関連する問題