Я только начал возиться с 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;
** Примечание: удалены много кода для удобства чтения **
i get Невозможно прочитать свойство 'emit' неопределенного. Я думаю, что они должны были делать req io, прежде чем регистрировать свои маршруты? которые выполняются в app.js? – atsituab
Да, сначала io, затем маршруты. – matys84pl
Я знаю, но это делается в var app = require ('../ app'); Мне нужно будет разместить эту строку в app.js vs bin/www. код, показанный выше, говорит мне, чтобы он вставлял его в bin/www, который я не могу сделать, прежде чем регистрировать маршруты. – atsituab