Avoiding callback hell Currently, the code below looks awful because of all the callbacks involved. How can I reduce the amount of nesting?  Also, would you recommend the use of q or Async.js?

var mongoose = require('mongoose');
var User = require('../models/user.js');
var Genre = require('../models/genre.js');
var Album = require('../models/album.js');
var Band = require('../models/band.js');

exports.populate = function (req, res) {
  var bandNames = [
    'The Cool Group',
    'The Peeps',
    'Music Creation',
    'Number and Wumbers',
    'Testing For You',
    'What What',
    'Alrightly Then',
    'Is this the way it is?',
    'It hurts to know who you are',
    'There has been one or two of you',
    'Please and eyond'
  ];

  var userNames = [
    'syte',
    'koumarianos',
    'ericStas',
    'bloodCobia'
  ];

  albumId = Album.create({
      name: 'Test Album',
      biography: 'example'
    }, 
    function (err, album) {
      if (!err) {

        var albumId = album._id;

        Genre.create({ name: 'Rock' }, function (err, genre) {
            if (!err) {
              var genreId = genre._id;

              var users = [];

              for (var i = 0; i &lt; userNames.length; i++) {
                users.push({
                  username: userNames[i]
                });
              }

              User.create(users, function (err) {
                var bands = [];
                var users = Array.prototype.slice.call(arguments, 1);
                var userIds = []

                for (var i = 0; i &lt; users.length; i++) {
                  userIds.push(users[i]._id);
                }

                res.send(userIds);

                if (!err) {
                  for (var i = 0; i &lt; bandNames.length; i++) {
                    bands.push({
                      name: bandNames[i],
                      biography: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ac iaculis dui. Duis dignissim est ut ante cursus sodales. Duis et turpis ac nisl dictum mollis. Ut vel tempus metus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis eu risus aliquet, mattis est vitae, tempus sem. In eget ante semper, adipiscing arcu eu, fringilla lectus. Sed non tortor vulputate magna sodales varius eu quis nulla. Sed dignissim sed magna sit amet sodales. Ut nisi tortor, dapibus quis nulla eu, consectetur ornare dolor. Morbi mollis diam ut vulputate consectetur. In tincidunt, elit quis ultricies auctor, dolor odio condimentum ligula, quis sodales magna dui at est. Integer a orci rutrum, fermentum sapien quis, facilisis purus.',
                      albums: [albumId],
                      genres: [genreId],
                      members: userIds
                    });
                  }

                  // save all bands
                  Band.create(bands, function (err) {
                      if (!err) {
                        res.send("Successfully made all test data");
                      } else {
                        res.send(err);
                      }
                  });
                }
              });
            } else {
              res.send(err);
            }
          });
      } else {
        res.send(err);
      }
    });
};
My 2 cents are:


This code is understandable, but I would still rewrite it since it is cookie cutter, and you will surely move on to more complex stuff 
Q uses a Promise object, Mongoose does not, so that would not work without some overhauling ( I personally like Q better though )
Async works with 'last parameter must be a callback' which is exactly how Mongoose works, so use that