2016-12-21 6 views
0

私は、React、webpack、expressフレームワーク全体には新しいですが、socket.ioを統合して表現するまで、Reactとwebpackコンポーネントはうまく動作しています。いくつかのリアルタイム通知があります。ここに私のサーバー側のコードがserver.jsである:socket.ioとReactでwebpackを実行することができません

// Babel ES6/JSX Compiler 
require('babel-register'); 
var React = require('react'); 
var ReactDOM = require('react-dom/server'); 
var Router = require('react-router'); 
var express = require('express'); 
var path = require('path'); 
var routes = require('./routes'); 
var bodyParser = require('body-parser'); 
var swig = require('swig'); 
var webpack = require("webpack"); 
var webpackConfig = require('./webpack.config'); 
var compiler = webpack(webpackConfig); 

var app = express(); 

app.use(express.static(path.join(__dirname))); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

const PORT = process.env.PORT || 8080; 

var WebpackDevServer = require("webpack-dev-server"); 

var server = new WebpackDevServer(compiler, { 
    contentBase: webpackConfig.output.path, 
    hot: true, 
    historyApiFallback: true, 
    filename: path.resolve(webpackConfig.output.path, webpackConfig.output.filename), 
    publicPath: webpackConfig.output.publicPath, 
    headers: { "Access-Control-Allow-Origin": "*" }, 
    stats: { colors: true } 
}); 


var server = require('http').createServer(app); 
var io = require('socket.io')(server); 

server.listen(PORT); 

//Whenever someone connects this gets executed 
io.on('connection', function(socket){ 
    console.log("Welcome to the Web Portal"); 

    socket.on('disconnect', function() { 
    console.log('Goodbye'); 
    }); 

}); 

app.post("/notify", function(req, res) { 
    var title = req.body.title; 
    var description = req.body.description; 
    io.emit('notification', title + '\n'+ description); 
    res.send("Notification received"); 
}); 

、ここでは私のクライアント側のコードは、index.htmlのである:

<!DOCTYPE html> 
<html class="background-grey"> 
    <head> 
    <link rel="stylesheet" href="/style/style.css"> 
    <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css"> 
    <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css"> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css"> 
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" /> 

    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/codemirror.min.css" /> 
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/theme/solarized.min.css" /> 

    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 


    </head> 
    <body class="background-grey"> 
    <div class="container"></div> 
    <script src="/bundle.js"></script> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io.connect(); 

     socket.on('notification', function(message) { 
     alert(message); 
     }); 
    </script> 

    </body> 
</html> 

私は基本的にWebPACKの-DEV-を通じて私のリアクトコンポーネントをレンダリングしています私が反応し、ミドルウェアを通じて標準的な方法それをやったとき以来の、サーバー:私は直接のURLに移動しようとしたとき

app.use(function(req, res) { 
    Router.match({ routes: routes.default, location: req.url }, function(err, redirectLocation, renderProps) { 
    if (err) { 
     res.status(500).send(err.message) 
    } else if (redirectLocation) { 
     res.status(302).redirect(redirectLocation.pathname + redirectLocation.search) 
    } else if (renderProps) { 
     var html = ReactDOM.renderToStaticMarkup(React.createElement(Router.RouterContext, renderProps)); 
     var page = swig.renderFile('index.html', { html: html}); 
     res.status(200).send(page); 
    } else { 
     res.status(404).send('Page Not Found') 
    } 
    }); 
}); 

それは私にこの問題Invariant Violation: Could not find "store" in either the context or props of "Connect(DashBoard)"を与えていました。また

、私はvar io = require('socket.io')(server);がWebpackDevServerからサーバーを呼び出すことになるようvar server = require('http').createServer(app);をコメントアウトしようとしたが、それは私にこのエラーがスローした場合:ほぼすべての記事の私が見てきた

var listeners = server.listeners('request').slice(0); 
         ^

をオンラインで記事を書くことはできましたが、自分のコードで実装することができませんでした。誰かが私のサーバを実行してReactコンポーネントを正しくレンダリングし、socket.ioを統合する方法について教えてください。

答えて

0

先ほど私が間違っていたことはあまりよく分かりませんが、私はプロジェクトの構造を再構築しました。それから、server.jsにsocket.ioを設定し、クライアントサイドでデータを送受信するためにドキュメントをたどり、完全に機能しました。 React、Express、Webpackの私の定型プロジェクトは、ここにあります:React Express Webpack Boilerplate Project

関連する問題