我在路由中使用socket.io时遇到问题。
在我的app.js.我指定了我的路线。
app.get('/', routes.index);
我的路线有一个index.js文件
exports.index = function(req, res){
res.render('index', { title: 'Example Title' });
io.sockets.on('connection', function(socket){
...
});
});
但是,我一直在index.js中收到错误“ReferenceError:io is not defined”。我是否需要将io对象传递到每个路由中或者在每个路由中都需要socket.io?
答案 0 :(得分:1)
我会告诉你如何在我的应用程序中使用socket.io,即使我不确定这是否是此问题的最佳做法。
在我的app.js中,我有以下几行:
var io = require('socket.io').listen(server, { log: false });
routeRegistrar.init(app, io);
routeRegistrar
是一个辅助函数,我只是通过每个控制器并注册其路由,参见:
var fs = require('fs');
var controllersFolder = "controllers";
var controllersFolderPath = __dirname + '/../' + controllersFolder + "/";
module.exports.init = function(app, io){
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
require(controllersFolderPath + controllerName).init(app, io);
});
};
请注意,我将io
var传播到每个控制器,因此每个控制器都可以使用它!
在控制器中我有以下内容:
var sockets; //see that this variable becomes global to the controller
module.exports.init = function(app, io) {
app.get("/chat", chat);
sockets = io.sockets;
sockets.on('connection', function(socket) {
//do any cool stuff here
});
};
function chat(){
//sockets is available here, at the route level - so do more cool stuff here
}
答案 1 :(得分:0)
是的,您可以在路线中使用socket.io。您收到错误“ReferenceError:io未定义”,因为未定义io lol。您需要包含“var io = require('socket.io')。listen(server)。这将在app.js中完美运行,因为在Express应用程序中,服务器被定义为”vas server = createServer(app)“你传入应用程序的地方。然而,为了在routes / index.js文件中声明服务器,你需要创建一个“globalserver”,你可以从你的节点项目中的任何文件访问。为此,我建议你创建一个confg.json文件,并创建一个config.js文件。
您的config.json文件应如下所示:
{
"all": {
"redis": {
"port": 6379
, "host": "127.0.0.1"
}
}
, "development": {
"env": "development"
, "db": "mongodb://...development"
}
, "staging": {
"env": "staging"
, "db": "mongodb://...staging"
, "redis": {
"pass": ""
}
}
, "production": {
"env": "production"
, "db": "mongodb://...production"
, "redis": {
"pass": ""
}
}
}
您的config.js文件应如下所示:
var env = process.env.NODE_ENV || 'development'
, core = require('./config.json')
var merge = function (target, source) {
for (var k in source) {
if (typeof target[k] === 'object' && typeof source[k] === 'object')
merge(target[k], source[k])
else
target[k] = source[k]
}
}
module.exports = function (app) {
global.config = {}
merge(global.config, core.all)
merge(global.config, core[env])
global.config.app = {
key: app.key
, port: process.env.PORT || app.port
, base: app.base
}
merge(global.config, app[env])
}
Now in app.js
require('./config')({
key: 'pinpoint'
, port: 3000
, base: '/'
, development: {
app: {
url: 'localhost:3000'
}
}
, staging: {
app: {
url: 'localhost:3020'
}
}
})
var express = module.exports.express = require('express')
var bodyParser = require('body-parser');
var http = require('http');
var app = module.exports.app = express();
global.appserver = http.createServer(app);
var router = express.Router();
...
您现在已经成功创建了一个可以在“routes / index.js”中访问的全局服务器
Soooo现在你在index.js文件中可以这样做:
global.io = require('socket.io').listen(global.appserver, { log:true});
io.sockets.on('connection', function(socket){
console.log("#### socket.io connected. Port 3000");
socket.on("scrape request", function(data) {
console.log("in here");
console.log(data);
})
})
您无法在“连接时”功能中执行路由。但是,您可以执行get / post调用,该调用调用get / post调用之外的函数,该函数会发出或接收数据。希望这会有所帮助。