我刚刚回复了另一个 SO 帖子 (Mean.io framwork with socket.io)。
注意:我使用的是 mean.io v0.5.26 和 socket.io v1.1.0。
在这里再次粘贴我的答案。
我也遇到了同样的问题,我花了大约一周的时间才终于把它弄好。我将尝试解释我的所作所为:
app.js
在这个文件中,我只是调用为我创建和设置 socket.io 对象的代码,然后将其传递给路由模块。
'use strict';
/*
* Defining the Package
*/
var Module = require('meanio').Module;
var MeanSocket = new Module('chat');
/*
* All MEAN packages require registration
* Dependency injection is used to define required modules
*/
MeanSocket.register(function(app, http) {
var io = require('./server/config/socketio')(http);
//We enable routing. By default the Package Object is passed to the routes
MeanSocket.routes(io);
return MeanSocket;
});
server/config/socketio.js
这个文件只是简单地配置了 socket.io 对象。请注意,我必须将 meanio 模块升级到 0.5.26 版才能完成这项工作,因为 http 对象(快速服务器)在较旧的 meanio 版本中不可用。此外,如果你想使用 ssl,你可以注入 https 而不是 http。
'use strict';
var config = require('meanio').loadConfig(),
cookie = require('cookie'),
cookieParser = require('cookie-parser'),
socketio = require('socket.io');
module.exports = function(http) {
var io = socketio.listen(http);
io.use(function(socket, next) {
var data = socket.request;
if (!data.headers.cookie) {
return next(new Error('No cookie transmitted.'));
}
var parsedCookie = cookie.parse(data.headers.cookie);
var sessionID = parsedCookie[config.sessionName];
var parsedSessionID = cookieParser.signedCookie(parsedCookie[config.sessionName], config.sessionSecret);
if (sessionID === parsedSessionID) {
return next(new Error('Cookie is invalid.'));
}
next();
});
return io;
};
routes/chat.js
最后使用routes文件定义socket事件等
'use strict';
// The Package is passed automatically as first parameter
module.exports = function(MeanSocket, io) {
io.on('connection', function(socket) {
console.log('Client Connected');
socket.on('authenticate', function(data, callback) {
});
});
};
希望这会有所帮助!