express.js 4 and sockets with express router

One option is to pass it in to req object.

app.js:

var express = require('express');
var path = require('path');
var logger = require('morgan');
var api = require('./routes/api');
var app = express();
var io = require('socket.io').listen(app.listen(3000));

app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));

io.sockets.on('connection', function (socket) {
    console.log('client connect');
    socket.on('echo', function (data) {
        io.sockets.emit('message', data);
    });
});

// Make io accessible to our router
app.use(function(req,res,next){
    req.io = io;
    next();
});

app.use('/api', api);

// error handlers omitted

module.exports = app;

./routes/api.js:

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

router.put('/foo', function(req, res) {
    /* 
      do stuff to update the foo resource 
      ...
     */

    // now broadcast the updated foo..
    req.io.sockets.emit('update', foo); 
});

module.exports = router;

I've modified your files a little bit, may you check if it works?

You can pass the io you've defined to your routes like below;

require('./routes/api')(app,io); 

I didn't test the Socket.IO parts but there is no syntax error and routes also working.

server.js file:

var express = require('express');
var app = express();
var path = require('path');
var logger = require('morgan');

var io = require('socket.io').listen(app.listen(3000));
 
app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
 
io.sockets.on('connection', function (socket) {
    console.log('client connect');
    socket.on('echo', function (data) {
    io.sockets.emit('message', data);
 });
});

require('./routes/api')(app,io); 
 
console.log("Server listening at port 3000");

api.js:

module.exports = function(app,io) {
app.put('/foo', function(req, res) {
 
    /* 
 
      do stuff to update the foo resource 
 
      ...
 
     */
 
 
    // now broadcast the updated foo..
    
    console.log("PUT OK!");
 
    io.sockets.emit('update'); // how?
    res.json({result: "update sent over IO"});
 
});
}