【问题标题】:Configuring Express 4.0 routes with socket.io使用 socket.io 配置 Express 4.0 路由
【发布时间】:2014-06-10 11:42:17
【问题描述】:

我创建了一个新的 Express 应用程序。它为我生成了 app.js,然后我创建了以下 index.js,引入了 socket.io:

var app = require('./app');
server=app.listen(3000);

var io = require('socket.io');
var socket = io.listen(server, { log: false });

socket.on('connection', function (client){
    console.log('socket connected!');
});

谁能告诉我如何在路由文件中访问 socket.io?

供参考,默认生成的app.js如下:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

/// catch 404 and forwarding 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: {}
    });
});


module.exports = app;

【问题讨论】:

标签: node.js express routes socket.io


【解决方案1】:

SocketIO 不适用于路由,它适用于套接字。

也就是说,您可能想使用express-io,因为这是专门为此而设计的,或者如果您正在构建一个实时网络应用程序,那么请尝试使用已经集成了 socketIO 的sailsjs

对你的主要app.js执行此操作

app = require('express.io')()
app.http().io()

app.listen(7076)

然后在您的路线上执行以下操作:

app.get('/', function(req, res) {
    // Do normal req and res here
    // Forward to realtime route
    req.io.route('hello')
})

// This realtime route will handle the realtime request
app.io.route('hello', function(req) {
    req.io.broadcast('hello visitor');
})

请参阅express-io documentation here

如果你真的想坚持使用 express + socketio,你也可以这样做

在您的app.js

server = http.createServer(app)
io = require('socket.io').listen(server)
require('.sockets')(io);

然后创建一个文件sockets.js

module.exports = function(io) {

    io.sockets.on('connection', function (socket) {
        socket.on('captain', function(data) {
            console.log(data);
            socket.emit('Hello');
        });
    });
};

然后您可以将其调用到您的路由/控制器。

【讨论】:

  • 谢谢,很有帮助!
  • 由于express.io使用的是旧版本的express 我建议你也看看下面的方式:stackoverflow.com/questions/24222483/…虽然我不太清楚作者试图在答案中解释什么,但我希望更多的人能够更好地探索和帮助解决这个问题。
  • 这是什么意思“然后你可以调用你的路由/控制器。” ?
  • Express.io 似乎没有维护。
  • 请给出完整的路由和控制器示例。
【解决方案2】:

路线:

const Router = require('express').Router

const router = new Router();

router.get('/my-route', (req, res, next) => {
    console.log(req.app.locals.io) //io object
    const io = req.app.locals.io
    io.emit('my event', { my: 'data' }) //emit to everyone
    res.send("OK")
});

module.exports = router

主文件:

const app = require('express')()
const server = require('http').Server(app);
const io = require('socket.io')(server)
const myroute = require("./route") //route file dir

app.use(myroute);

server.listen(3000, () => {
    console.log('¡Usando el puerto 3000!');
});

app.locals.io = io

【讨论】:

  • expressjs.com/es/api.html app.locals 是一个空对象,你可以在其中存储变量,我只是简单地将 io 分配给 socket.io 依赖项
  • 如果客户端位于单独的位置,您如何从客户端连接
  • 只需在您的客户端实现中使用 ws://localhost:3000
【解决方案3】:

我认为更好的方法是将 Io 服务器附加到响应对象中。在第一个中间件中。按照 express 的设计方式,Io 服务器将可用于您的后续路由。

Check this link

【讨论】:

  • 如果您发布示例而不是链接会更好。该 URL 将我们带到假设我们正在使用快速应用程序生成器的东西,当然我们只能获取重要的东西并在我们的项目中使用它;在我看来,最好只发布一个通用的工作示例。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2015-05-01
  • 2021-05-14
  • 2016-09-20
相关资源
最近更新 更多