1

I'm trying to get into the node.js world and would like to build a simple but complete testing app to hook up node.js with socket.io and backbone.js using redis as a store. I found a couple of tutorials and a few examples as well. Somehow I just get confused about the whole architecture I have to use. Usually you'd define all your routes within your server.js with express. So you get a full control of your routes on the server side. Now linking up backbone you have to define routes again? This seems to be a model aspect but for me it seems like double-work which I somehow dislike. So did I just got confused and things work completely differently? Maybe someone has a link to a good tutorial or example where it's made more clear.

2 Answers 2

1

Now linking up backbone you have to define routes again?

depends on what you mean by route.

you need to tell backbone where to find the server resources so it make sense for a model to tell it where to get it ( url parameter in the model ).

The route Class in backbone has nothing to do with routes on the server. It is just a way to change the application state or the displayed views within the page.

for instance in a LOB app you have a list view and a detail view.

backbone allows you to switch between the views via the router without refreshing the page.

the url for the list could be http://app.com/#list , the url for the detail view could be http://app.com/#detail/:id where id would be the product id. you can switch between views without refreshing the page just by clicking on a link defined as

<a href="#detail/1">product 1</a> 

and back to the list view

<a href="#list">product list</a>

then you can have a view that display a product form

<a href="#newproduct">Create a new product</a>

and so on. so you dont have to set up event listeners in your views to switch between views that should not be aware of each others, and that without requesting anything to the server and without page refresh. It is a conveniant way to structure your application.

Sign up to request clarification or add additional context in comments.

1 Comment

thanks camus for your reply. It loosens then knot in my head a bit. However I'm still lost how to create the overall architecture to have a fluent and seemingless communiction. I'll try to get a bit deeper into backbone itself and then hopefull figure out something.
1

I'm using something similar for front-end Backbone Model

class Model extends Backbone.Model

    idAttribute: '_id'

    _sync: (method, model, options) =>
        options.data ?= {}
        @socket.emit method, @name(), model.toJSON(), options.data, (err, data) => 
            if err then console.error "error in sync with #{method} #{@.name()} with server (#{err})" else options.success(data)

    sync: (method, model, options) => 
        if @socket.connected() is no 
            @socket.once 'connect', => @_sync method, model, options
        else 
            @_sync method, model, options

    name: => 
        if @collection and @collection.name then return @collection.name else throw new Error "Socket model has no name (#{@.collection})"

    initialize: ->
        @socket = require('socket')

module.exports = Model

And this is my basic Backbone Collection

class Collection extends Backbone.Collection

    model: require('class/socket/model')

    _sync: (method, collection, options) =>
        @socket.emit method, @.name, collection.toJSON(), options.data, (err, data) => 
            if err then console.error "error in sync with #{method} #{@.name} with server (#{err})" else options.success(data)

    sync: (method, collection, options) => 
        if @socket.connected() is no 
            @socket.once 'connect', => @_sync method, collection, options
        else 
            @_sync method, collection, options

    garbage: false

    register: =>
        @socket.emit 'register', @name

    deregister: =>
        @socket.emit 'deregister', @name
        @garbage = true

    initialize: (options) ->
        @name = options.name if options and options.name
        if !@name then throw new Error 'Socket collection has no name'
        @socket = require('socket')

        # Registrating socket for connection
        @socket.on 'connect', => @register() if @garbage is off
        if @socket.connected() is yes then @register()

        @fetch()        

        # Registration for socket events for this collection
        @socket.on @name, (method, model) =>

            if method is 'reset'
                @reset(model)

            if method is 'delete'
                m = @get model._id 
                m.trigger 'destroy', m, m.collection

            if method is 'update'
                m = @get model._id
                m.set(model)

            if method is 'create'
                @add(model)

            console.log "SOCKET: " + method + " triggered for collection " + @name

module.exports = Collection;

It's CoffeeScript if you don't mind.

All tutorials that I have seen use register / deregister for collections.

The important stuff is to find a way to introduce authentication to the backend with those collections and models. It's not that hard, but it's tricky.

Also be careful for managing two socket connections by the same user. It needs to send socket update to the same user but to the other connection.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.