2017-12-01 3 views
1

私はsocket.ioで作業しようとしていますが、サーバーでhttpsを実行するとsocket.ioが動作しません。Express +ハンドルバーのSocket.ioはhttpsで動作しません

マイapp.js

let express = require('express'); 
let path = require('path'); 
let favicon = require('serve-favicon'); 
let logger = require('morgan'); 
let cookieParser = require('cookie-parser'); 
let bodyParser = require('body-parser'); 

let index = require('./routes/index'); 
let users = require('./routes/users'); 
let dashboard = require('./routes/dashboard'); 



let app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'hbs'); 

// uncomment after placing your favicon in /public 
app.use(favicon(path.join(__dirname, 'public/images', 'chatbotico.png'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(methodOverride('X-HTTP-Method-Override')); 
app.use(session({secret: 'supernova', saveUninitialized: true, resave: true})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

// Session-persisted message middleware 
app.use(function(req, res, next){ 
    let err = req.session.error, 
     msg = req.session.notice, 
     success = req.session.success; 

    delete req.session.error; 
    delete req.session.success; 
    delete req.session.notice; 

    if (err) res.locals.error = err; 
    if (msg) res.locals.notice = msg; 
    if (success) res.locals.success = success; 

    next(); 
}); 


app.use('/', index); 
app.use('/users', users); 
app.use('/users/dashboard', dashboard); 

// realtime chatbot 
    let socket = require('./config/sock'); 
    // Socket connection 
    socket.conn(); 
socket.fromClient(); 


// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    let err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

ので、代わりのapp.jsにsocket.ioを使用して、私はそれがアプリから呼び出されると、すべてのソケット構成を保持しているだ機能を作成しました

だから私のクライアント側から、私は輸入socket.io jを

./config/sock

let app = require('express')(); 
let https = require('https'); 
let fs = require('fs'); 

let options = { 
    key: fs.readFileSync('./server.key'), 
    cert: fs.readFileSync('./server.crt'), 
    requestCert: false, 
    rejectUnauthorized: false 
}; 


let server = https.createServer(options, app); 


let io = require('socket.io')(server); 
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]); 

let conn = function() { 
    server.listen(8080, function(){ 

    }); 

    app.get('/', function (req, res) { 
     res.set('Content-Type', 'text/xml; charset=utf-8'); 
     res.sendfile(__dirname + '/index.html'); 
    }); 
}; 

let fromClient = function() { 
    io.on('connection', function (socket) { 
     socket.on('fromClient', function (data) { 
      console.log(data); 
      }); 
     }); 
    }); 
}; 
module.exports = {conn,fromClient}; 

をしましたハンドルバー上のsが、私はconvo.js

にサーバ側で接続しよう./routes/dashboard

./views/dashboard/dashboard.hbsこのインポートと

<html> 
[...] 
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> 
<script src="../javascripts/convo.js"></script> 
[...] 
<html> 

にroutered

./public/convo.js

let socket = io.connect('https://localhost:8080', { secure: true, reconnect: true, requestCert: false, rejectUnauthorized: false }); 

socket.emit('fromClient', { 'client' : 'some value'}); 

私の問題は、私が試したているすべての場所私のブラウザで、自己署名証明書とのhttps接続を許可するようにしてください。そして私はそれを通過させる方法を知らない。

localhost:8080 uses an invalid security certificate. 
The certificate is not trusted because it is self-signed. 
The certificate is not valid for the name localhost. Error code: 
SEC_ERROR_UNKNOWN_ISSUER 

誰かが私に光を与えることができますか?これは製品ではなく、大学のプロジェクトで証明書を購入したくないです。

答えて

0

O.ジョーンズの回答が私を大きく助けました。しかし私はsocket.ioの使用方法を変更しました

Expressと同じサーバーでソケットをフックします。私はしましビン/ WWW上の

// Socket connection 
let server = require('http').Server(app); 
socket.fromClient(server); 
すぎ

ビン/ WWWへの輸出、サーバー変数

module.exports = {app: app, server: server}; 

だからapp.jsに、私はしましたsoket接続を変更しますアプリとサーバを輸入し、それを実行します。

var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 

    var app = require('../app').app; 

var server = require('../app').server; 
/** 
* Listen on provided port, on all network interfaces. 
*/ 

server.listen(port); 
server.on('error', onError); 

だからこれは私がアップRU内(サーバー側)私のsocket.ioを使用することを許可nning Expressサーバー。

私はローカルホスト(または所望の宿主)を呼び出してきたクライアントのサイトで
let api = require('./api'); 
let ipfs = require('./handlefiles'); 
let funct = require('./function'); 
let io; 


let fromClient = function(server) { 

    io = require('socket.io')(server); 

    io.on('connection', function (socket) { 
     socket.on('fromClient', function (data) { 
      api.getRes(data.client).then(function(res){ 
       socket.emit('fromServer', { server: res.message, treat: res.action }); 
      }); 
     }); 
    }); 
}; 

module.exports = {fromClient}; 

let socket = io('//localhost:3000'); 

これは、サーバー側のwithingクライアントをフックアップし、私はのための証明書を必要とすることなく、自分のアプリケーションの実行を許可それはサーバーのような開発と生産の両方でです。

1

私はこの問題を抱えてきました。 (ブラウザは、本当にこれ以上協力しないだろう。おかげで、私たちの残りの部分のためにそれを台無しための世界のすべてのあなたの愚かなサイバー犯罪者を。)

まず、

lucas.example.com 127.0.0.1 
のようなエントリが含まれているために、マシンのhostsファイルを編集します

だから、自分のマシンからhttp://localhost:8080の代わりにhttp://lucas.example.com:8080を打つことができます。それを働かせてください。ホストファイルを編集する方法については、お気に入りの検索エンジンを使用してください。

次に、lucas.example.comという共通名の自己署名証明書を作成します。その証明書をローカルマシンのWebサーバーにインストールします。ヒットhttps://lucas.example.com:8080。ブラウザに証明書のエラーが表示されます。それを上書きして、https経由でローカルホストを見ることができると確信してください。

次に、自己署名証明書をブラウザにインポートし、ブラウザに信頼するように指示する方法を理解します。これは役に立ちます。 Getting Chrome to accept self-signed localhost certificate

次に、ブラウザからwssアクセスできるようになります。

最後に、自分のマシン上のnode.jsに自己署名証明書を信頼させる必要があります。これは役に立ちます。 How do I use a self signed certificate for a HTTPS Node.js server?

最悪が最悪の場合、namecheap.com(Comodoの販売代理店)から1年間の証明書を10ドル未満で購入することができます。あなたはあなたがドメインを所有していることを証明しなければならないでしょう。

あなたの大学のIT部門を嫌うかもしれないし、教授にそれをさせるかもしれません。適切なTLS証明書は、適切に構成された大学開発ラボの一部である必要があります。彼らは*.studentlab.cs.uni.eduのようなワイルドカード証明書を取得し、この種の作業のために自分でlucas.studentlab.cs.uni.eduを作ってください。

+0

ありがとうO.Jones! 、私はすべてのヒントをチェックし、私はあなたに迅速に応答を与える:) –

関連する問題