Socket.io not working with Express 4 without using diffrent port number
当我指定与服务器端口号不同的socket.io端口号时,我的应用程序可以工作。工作代码如下:
这是我的app.js文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var configDB = require('./config/database.js'); var session = require('express-session'); var passport = require('passport'); var routes = require('./routes/index'); var auth = require('./routes/auth.js'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.set(process.env.PORT || 1337); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(require('stylus').middleware(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public'))); app.use(session({ secret: 'mysessionsecret' })); app.use(passport.initialize()); app.use(passport.session()); mongoose.connect(configDB.url); app.use('/', routes); app.use('/auth', auth); // catch 404 and forward to error handler app.use(function (req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function (err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function (err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); var talk = require('./socket/talk.js')(app); module.exports = app; |
这是我的talk.js文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | var init = function (app){ var server = require("http").createServer(app).listen(3000); var io = require("socket.io").listen(server); var socketioJwt = require("socketio-jwt"); var jwtSecret = require('../config/jwtSecret'); console.log("init"); io.set("authorization", socketioJwt.authorize({ secret: jwtSecret, handshake: true })); io.sockets.on("connection", function (socket) { console.log("connected"); socket.on("send", function (data) { console.log(data); var username = data.username; var message = data.message; var datetime = data.datetime; socket.broadcast.emit("send", data); }); socket.on("busy", function () { socket.emit("busy"); socket.broadcast.emit("busy"); }); socket.on("free", function () { socket.emit("free"); socket.broadcast.emit("free"); }); }); } module.exports = init; |
这是我在index.ejs中的脚本标签:
1 | <script src="http://localhost:3000/socket.io/socket.io.js"> |
最后这是我从客户端进行的io连接:
1 2 3 | socket = io("http://localhost:3000/",{ query: 'token=' + tok }); |
这可行,但是问题是我想将网站发布到Azure,但是不可能让Azure网站侦听不同的端口。至少我认为这是不可能的。
我尝试过的许多事情之一就是将talk.js文件更改为此:
1 2 3 4 | var init = function (app){ var server = require("http").createServer(app).listen(app.get('port')); var io = require("socket.io").listen(server); ... |
但是我不起作用。我总是得到与
相似的东西
如果我将index.ejs文件中的脚本标签更改为此
1 | <script src="http://cdn.socket.io/socket.io-1.2.1.js"> |
socket.io.js文件被加载,但是当我从客户端连接时,出现连续404找不到错误。
我在线查看了许多解决方案,但没有一个起作用。我真的不知道我在做什么错。
此错误来自使用
此github存储库是此解决方案的实现,可以用作任何