虽然在使用node写异步处理的代码的时候应该使用Q(promise库)或者使用async模块来让嵌套callback改变结构,不过对于初学者来说这两个工具都不太容易理解所以先分享一个常规的mongoose查询处理错误的最佳方法:

var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/test');
var conn = mongoose.connection;
function getInsertedArticles(cb) {

    // 插入用户
    conn.collection('users').insert([{/*user1*/},{/*user2*/}], function(err, docs) {
    if (err) {
        cb(err);//每次出现错误,我们都把它抛给cb 这个callback
        return;

    }

    var user1 = docs[0], user2 = docs[1];

    // 插入频道
    conn.collection('channels').insert([{userId:user1._id},{userId:user2._id}], function(err, docs) {

        if (err) {
            cb(err);//===========
            return;
        }

        var channel1 = docs[0], channel2 = docs[1];
        // 插入文章
        conn.collection('articles').insert([{userId:user1._id,channelId:channel1._id},{}], function(err, docs) {
            if (err) {
                cb(err);//===========
                return;
            }

            var article1 = docs[0], article2 = docs[1];
            //====第一个null用来存放错误信息的占一个位置而已
            cb(null, [article1, article2]);

            }

        });

    };

}
getInsertedArticles(function (err, articles) {
    if (err) {
        // 主要在前面的查询中,任意一个 查询失败了,都会出现在这里,而且接下里的查询将停止
        // `articles` is `undefined`.
    } else {
        // 如果所有的查询都没有错误,那么这里将运行,你可以得到文章了。
        // `err` 是 null.
    }

});
    深入理解AngularUI路由_ui-router安装MAC使用GUID分区出现boot0:test boot0:error