Node.js - 如何从 app.js 外部发出 socket.io 事件?

Posted

技术标签:

【中文标题】Node.js - 如何从 app.js 外部发出 socket.io 事件?【英文标题】:Node.js - How to emit socket.io events from outside app.js? 【发布时间】:2014-05-24 14:31:16 【问题描述】:

我一直在尝试以一种简单而有效的方式组织我的应用程序,而不是在 app.js 文件的底部处理我的所有事件。

我不得不说,我的应用程序很简单,我不是专业开发人员,所以我正在寻找简单的东西。我发现的其他解决方案都太复杂了

我的项目的文件夹结构如下:

node_modules
public
models
 ----> User.js
app.js

在 User.js 中,我有以下代码:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    bcrypt = require('bcrypt-nodejs');

var User = function()

    var userSchema = new Schema(
      email : type: mongoose.SchemaTypes.Email,
      required: true,
      index:  unique: true 
    
    );

    var userModel = mongoose.Model('User', userSchema);

    this.create = function(user_infos)

        var newUSer = new userModel(
                password:bcrypt.hashSync(data.user_infos.password),
                email:data.user_infos.email
            );

        newUser.save(function(err)
            if(err) //...
            else
                socket.emit('user created', id:user._id.toString());
            
        );
    
);

module.exports = User;

我的 app.js 看起来像这样:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    mongo = require('mongodb'),
    mongoose = require('mongoose'),
    bcrypt = require('bcrypt-nodejs'),
    User = require('./models/User.js'),
    Event = require('./models/Event.js')


    // ========= CONFIG ================
    app.set('port', process.env.PORT || 1337);
    app.use(express.static(__dirname + '/public'));
    io.set('log level', 1);


    //========= ROUTES ================
    app.get('/home', function(req,res)
        res.sendfile( __dirname + '/index.html');
    );
    app.get('*', function(req,res)
        res.redirect('/home');
    );


    server.listen(app.get('port'), function() 
    console.log("Listening on " + app.get('port'));
    );

    var MONGOHQ_URL="mongodb://........."

    mongoose.connect(MONGOHQ_URL);
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback () 
      console.log("Connection to the database succes!");

        io.sockets.on('connection', function(socket)
        console.log('Client connected');

        global.socket = socket;

        socket.on('try me!', function(data)

                User.create(data);

            );
        );

    );

我不会假装这是一种组织事物的好方法,但这是我能理解的。

当事件在客户端触发时,服务器停止,Chrome Dev Tools 打印出来:

GET http://localhost:1337/socket.io/1/?t=1397151884883 net::ERR_CONNECTION_REFUSED 

有什么想法吗?

【问题讨论】:

global.socket = socket 来自之前的尝试...失败了 【参考方案1】:

这是我如何做的简化版本。

app.js

var controllers = require('./controllers');
controllers.io.listen(server, db);

控制器/index.js

var controllers = 
    io: require('./ioController')


module.exports = controllers;

ioController.js

var socketio = require('socket.io');

module.exports.listen = function(server, db) 
  io = socketio.listen(server);
  io.on('connection', function(socket) 

  // ... do something

  );
  return io;

我是从这里得到的:https://***.com/a/9857516/2063561

【讨论】:

以上是关于Node.js - 如何从 app.js 外部发出 socket.io 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spotify Search API 获取数据并将其解析为 JSON? [在 node.js 中

Node.js:如何从回调中正确返回对象?

如何使用源映射远程调试 Node.js 应用程序(使用 WebStorm)

如何快速搭建node.js项目,app.js详解

如何从 Node.js 中执行外部程序?

如何从Google Cloud Function(Cheerio,Node.js)发出多个http请求