2017-12-01 7 views
1

socket.io를 사용하려고합니다.하지만 서버에서 https를 실행하면 socket.io가 작동하지 않습니다.Express + handlebars의 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를 사용하여, 나는이 응용 프로그램에서 호출 모든 소켓 구성을 보유하고있어 함수를 만든

./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}; 

, 내가 수입 socket.io의 J를했습니다 핸들에들, 내가 convo.js

을에 서버 측과 연결을 시도이 수입에

<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> 

./routes/dashboard

./views/dashboard/dashboard.hbs에 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와 동일한 서버로 소켓을 연결합니다.

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

그리고 빈/www를 수출, 서버 변수 i가했습니다 너무 빈에

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

/WWW :

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); 

이렇게하면 최대 내에서 내 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 
과 같은 항목을 포함하는 컴퓨터의 호스트에게 파일을 편집

이므로 자신의 컴퓨터에서 http://localhost:8080 대신 http://lucas.example.com:8080을 누르십시오. 작동하도록하십시오. 즐겨 찾는 검색 엔진을 사용하여 호스트 파일을 편집하는 방법을 알아보십시오.

둘째, 일반 이름이 lucas.example.com 인 자체 서명 인증서를 만듭니다. 로컬 컴퓨터의 웹 서버에 인증서를 설치하십시오. 조회수 : 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의 리셀러)에서 10 달러 미만의 가격으로 1 년용 인증서를 구입할 수 있습니다.당신은 당신이 도메인을 소유하고 있음을 증명해야합니다.

아니면 대학의 IT 부서에 불만을 제기하거나 교수님에게 그렇게하도록하십시오. 적절한 TLS 인증서는 올바르게 구성된 대학 개발 실험실의 일부 여야합니다. 그들은 *.studentlab.cs.uni.edu과 같은 와일드 카드 인증서를 얻어야하며 이런 종류의 작업을 위해 lucas.studentlab.cs.uni.edu을 직접 만들 수 있습니다.

+0

감사합니다. O.Jones! , 나는 모든 요령을 확인하고 나는 당신에게 신속하게 답변을 줄 것이다 :) –

관련 문제