1

i've been trying to organize my app in a simple yet effective way, other than processing all my events at the bottom of the app.js file.

i have to say, my apps are simple, i'm not a pro developper, so i'm looking for something simple. Other solutions i've found were all too complicated

my project's folder structure is the following :

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

inside User.js, I have the following code :

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;

And my app.js looks like this:

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

            });
        });

    });

I don't pretend that this is a good way to structure things, but that's something I can understand.

When the event is triggered clientside, the server stops and Chrome Dev Tools prints out:

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

Any thoughts ?

Louis
  • 146,715
  • 28
  • 274
  • 320
Radioreve
  • 3,173
  • 3
  • 19
  • 32

1 Answers1

4

Here's a simplified version of how I did it.

app.js

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

controllers/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;
}

I got that from here: https://stackoverflow.com/a/9857516/2063561

Community
  • 1
  • 1
stealthysnacks
  • 1,091
  • 1
  • 12
  • 16