2015-11-21 4 views
0

Я только начал возиться с websockets и выразить, и я не могу заставить его работать с моей текущей архитектурой.pass socketio между слоями в express4

я видел в другом вопросе, чтобы сделать следующее, прежде чем я объявляю мои маршруты

//this goes prior to your route registration 
app.use(function(req, res, next) { 
    req.io = io; 
}); 

, но я даже не знаю, как я могу передать И.О. мое приложение JS использовать фрагмент кода выше.

У меня есть мой bin/www: Я считаю, что это было введено в express4? гнездо прекрасно соединяется здесь

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var debug = require('debug')('server:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

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

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 

/** 
* attach socket to express 
*/ 
var io = require('socket.io').listen(server); 

/** 
* Listen on provided port, on all network interfaces. 
*/ 

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


io.sockets.on('connection', function() { 
    console.log('!!!sockets io connected!!!'); 
}) 

/** 
* Normalize a port into a number, string, or false. 
*/ 

function normalizePort(val) { 
    var port = parseInt(val, 10); 

    if (isNaN(port)) { 
    // named pipe 
    return val; 
    } 

    if (port >= 0) { 
    // port number 
    return port; 
    } 

    return false; 
} 

мои приложения.js. это, где я хочу использовать первый фрагмент кода правильно? но я не знаю, как передать «IO» в этот файл

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

/** 
* Route Imports 
*/ 

var app = express(); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

//THIS IS WHERE I WOULD PUT IT???? assuming I can pass IO into this?? 
app.use(function(req, res, next) { 
    req.io = io; 
}); 

/** 
* Routes 
*/ 
var router = require('./router')(app); 

module.exports = app; 

маршрутизаторы index.js

/** 
* The Index of Routes 
*/ 

module.exports = function (app) { 

    app.use('/test', require('./routes/test')); 
} 

и, наконец, маршрут, им предполагая, как только я получаю, что первый фрагмент кода в моем app.js это будет работать, поскольку оно будет прикреплено к req?

var express = require('express'); 
var router = express.Router(); 

router.get('/', function (req, res) { 
    //I WANT SOCKET TO JUST RESPOND WITH ANYTHING BUT I CANT GET 
    //AN INSTANCE OF IO IN HERE 
    req.io.emit('test', 'hihi'); 
}); 

router.post('/', function (req, res) { 
    test.save(function (err) { 

    if (err) { 
     console.log(err); 
     res.status(500).json({ 
     'message': 'error' 
     }); 
    } else { 
     // Log success 
     console.log('Success'); 
     req.io.emit('test:added', test); 
     res.status(201); 
    } 

    }); 
}); 
module.exports = router; 

** Примечание: удалены много кода для удобства чтения **

ответ

0

Основной модуль:

var app = express(); 
// ... 
var server = http.createServer(app); 
// ... 
var io = require('socket.io').listen(server); 

// ... 

app.use(function (req, res, next) { 
    req.io = io; 
}) 

require('../app')(app); 
require('../routes')(app);  

Ваш модуль приложения предоставляет app экземпляр, так что вы можете использовать его в основном модуле был ли у вас доступ к io. Просто.

+0

i get Невозможно прочитать свойство 'emit' неопределенного. Я думаю, что они должны были делать req io, прежде чем регистрировать свои маршруты? которые выполняются в app.js? – atsituab

+0

Да, сначала io, затем маршруты. – matys84pl

+0

Я знаю, но это делается в var app = require ('../ app'); Мне нужно будет разместить эту строку в app.js vs bin/www. код, показанный выше, говорит мне, чтобы он вставлял его в bin/www, который я не могу сделать, прежде чем регистрировать маршруты. – atsituab

Смежные вопросы