使用Express 4模块化Socket.io

Guilherme Rv Coelho

我正在尝试模块化我的应用程序文件,而Socket.io遇到了问题我想在自己的计算机中使用io routes.js像这样的东西:

var router = require('express').Router();
var io     = require('./sockets/my-io');

router.get('/', function(req, res) {
  io.emit('request-detected');
});

module.exports = router;

但是我做不到,因为socket.io需要应用服务器,并且当我位于routes.js文件中时,应用服务器还没有在侦听或正在导出。

您能给我一个解决方案,还是任何其他解决此问题的方法?

这是我所拥有的,如果可能的话,我想保留文件结构

app.js

var app = require('express')();
var routes = require('./routes');

/* ... */

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

module.exports = app;

斌/ www

#!/usr/bin/env node

var app = require('../wallet');

var server = app.listen(port, function() {
  debug('Express is listening o port ' + port);
});

routes.js

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

router.get('/', function(req, res) {
  console.log('hey');
});

module.exports = router;
安德烈亚斯·加斯曼(Andreas Gassmann)

您可以通过将io变量传递给routes模块来实现。

斌/ www

#!/usr/bin/env node

var app = require('./app');

var server = app.listen(3000, function() {
    console.log('Express is listening on port 3000');
}); // start the server

var socket = require('./socket')(server); // require socket.io code
var routes = require('./routes')(socket); // require routes

app.use('/', routes);

app.js

var express = require('express');

var app = express();

app.use(express.static(__dirname + '/public'));
app.set('views engine', 'ejs');
app.set('views', __dirname + '/');

module.exports = app;

socket.js

var socketio = require('socket.io');
function init(server) {
    var io = socketio(server);
    io.on('connection', function (socket) {
        console.log("socket connected");
        socket.on('newEvent', function (data) {
            console.log(data);
        });
    });
    return io;
}

module.exports = init;

routes.js

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

function init(io) {
    route.get('/', function (req, res) {
        res.render('index.ejs', {});
        setTimeout(function() {io.emit('newEvent', {message: "Hi from the server"})}, 2000);
    });
    return route;
}
module.exports = init;

上面的代码为我工作。但是,我不确定您为什么要这样做。

在路由器内部,您仍然可以完全控制要通过html发送给用户的内容,因此您可以直接将数据添加到html中。socket.io的想法是,一旦客户端加载了html并使用socket.io建立了到服务器的连接,便可以在客户端和客户端之间发送数据。

如您在中所见routes.js,我不得不在发射中添加一个超时。这是因为套接字事件将在浏览器重新加载页面之前发出。就我而言,浏览器记录了事件,然后立即刷新,丢失了您刚刚发送的数据。

另一个问题是,您对请求页面的客户端套接字一无所知,因为该客户端尚未连接。这意味着调用io.emit()会将事件发送到所有连接的套接字。

就像我说的,这实际上取决于您到底想做什么。

编辑:

您可以使用socket.io来代替使用ajax更新联系人。

socket.js

var socketio = require('socket.io');
function init(server) {
    var io = socketio(server);
    io.on('connection', function (socket) {
        console.log("socket connected");
        socket.on('newContact', function (data, callback) {
            // add data.contactName to db

            // after adding something, you use the callback to
            // send the added data back to the client

            // callback(newContact);
        });
    });
    return io;
}

module.exports = init;

index.html

<script type="text/javascript" >
    var socket = io();
    // call this emit when the user wants to add a contact
    socket.emit('newContact', {contactName: name}, function(newContact) {
        // here you will get the result from the server and you can
        // update the html with jquery for example
    });
</script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Express 4模块化Socket.io

来自分类Dev

模块化Express / Socket.io应用程序

来自分类Dev

在Express JS中使用Socket IO

来自分类Dev

在Express JS中使用Socket IO

来自分类Dev

在Bootstrap 4和React中使用模块化CSS

来自分类Dev

如何使用Node.js Express模块化路由

来自分类Dev

Express 4 + Socket.io = 404

来自分类Dev

Socket.io和Express 4

来自分类Dev

表达4 + socket.io或express.io?

来自分类Dev

Express中的模块化路线

来自分类Dev

express nodejs,模块化应用

来自分类Dev

如何使用Express,AngularJS,Socket.io广播并获取通知?

来自分类Dev

在nodeJS中使用express和socket.io时值重复

来自分类Dev

无法使用Express Server连接到socket.io

来自分类Dev

使用express的socket.io更新DOM中的变量

来自分类Dev

使用socket.io配置Express 4.0路由

来自分类Dev

在KrakenJS / Express中将socket.io作为模块加载

来自分类Dev

使用sesssion.socket.io-express4未定义会话

来自分类Dev

将socket.io与Express 4生成器一起使用

来自分类Dev

对间隔使用模块化算法

来自分类Dev

在Express io中使用https

来自分类Dev

模块化我的Express / Mongoose API代码,使其更易于使用

来自分类Dev

如何使用函数、类和 req.pipe 模块化 Express 应用程序?

来自分类Dev

模块化电源,是否使用其他类型的模块化电缆?

来自分类Dev

模块化电源,是否使用其他类型的模块化电缆?

来自分类Dev

如何将socket.io模块化为多个页面

来自分类Dev

如何在Express 4路由中使用socket.io向连接的套接字发出事件?

来自分类Dev

在Express.js v4和Socket.io v1中使用会话

来自分类Dev

letsencrypt-express与Socket.IO