Node.js 通过承诺加载节点-orm2,导致找不到CWD和模块

Node.js 通过承诺加载节点-orm2,导致找不到CWD和模块,node.js,express,promise,node-orm2,Node.js,Express,Promise,Node Orm2,我有一个加载节点orm模型的函数: function(server, connectionString){ server.use(orm.express(connectionString, { define: function (db, models, next) { loadIdeaDomain(db) next() } })) return this } 还有

我有一个加载节点orm模型的函数:

function(server, connectionString){
    server.use(orm.express(connectionString,  {
        define: function (db, models, next) {
            loadIdeaDomain(db)
            next()          
        }   
    }))
    return this
}
还有另一个中间件(passport)需要在加载节点orm模型后运行。。。但是aync的天性让我疯狂。我是否可以将上述内容转换为承诺或等待其执行后再继续

更新将loadIdeaDomain转换为承诺 这看起来似乎可以工作,但我遇到了一个错误:

{[错误:找不到模块 'C:\Users\todd\Documents\web\nodeTest\trq\node\u modules\q/.idea domain/idea domain.js'] 代码:“未找到模块”}

因此,这似乎可以追溯到节点orm library module Utilities.js和这个很棒的函数:

exports.getRealPath = function (path_str, stack_index) {
    var path = require("path"); // for now, load here (only when needed)
    var cwd = process.cwd();
    var err = new Error();
    var tmp = err.stack.split(/\r?\n/)[typeof stack_index !== "undefined" ? stack_index : 3], m;

    if ((m = tmp.match(/^\s*at\s+(.+):\d+:\d+$/)) !== null) {
        cwd = path.dirname(m[1]);
    } else if ((m = tmp.match(/^\s*at\s+module\.exports\s+\((.+?)\)/)) !== null) {
        cwd = path.dirname(m[1]);
    } else if ((m = tmp.match(/^\s*at\s+.+\s+\((.+):\d+:\d+\)$/)) !== null) {
        cwd = path.dirname(m[1]);
    }

    if (path_str[0] !== path.sep) {
        path_str = cwd + "/" + path_str;
    }
    if (path_str.substr(-1) === path.sep) {
        path_str += "index";
    }

    return path_str;
};
这就是问题所在

path_str = cwd + "/" + path_str;

好吧,我决定在ORM.js中重写load方法,我将该方法重新定义为:

var loadViaFullPath = function() {
    var files = _.flatten(Array.prototype.slice.apply(arguments));
    var cb    = function () {};

    if (typeof files[files.length - 1] == "function") {
        cb = files.pop();
    }

    var loadNext = function () {
        if (files.length === 0) {
            return cb();
        }

        var file = files.shift();

        try {
                    // NOTICE THE REMOVAL OF Utilities
            return require(file)(this, function (err) {
                if (err) return cb(err);

                return loadNext();
            });
        } catch (ex) {
            return cb(ex);
        }
    }.bind(this);

    return loadNext();
}
然后

我这样称呼它:

    server.use(orm.express(connectionString,  {
        define: function (db, models, next) {
            loadIdeaDomain(db).then(function(models){
                definedModels = models
                next()
            })
        }   
    }))
使现代化
不完全正确-它似乎没有在继续之前捕获和存储

zou是否有错误或其他问题?它可以工作,但async II希望知道它何时完成,以便链的其余部分继续。我正在将loadIdeaDomain转换为承诺。。。我会发布更新
var loadIdeaDomain = function(db){
    var ideaDomainPath = __dirname + '/idea-domain/idea-domain.js'
    console.log('loading ' + ideaDomainPath)

    db.load2 = loadViaFullPath

    var qLoad = Q.nbind(db.load2, db)
    return qLoad(ideaDomainPath).then(function(){
        _.each(_.keys(db.models), function(modelName) {
            makeQPromises(db.models[modelName], modelName)
        })
        return db.models
    })
}
    server.use(orm.express(connectionString,  {
        define: function (db, models, next) {
            loadIdeaDomain(db).then(function(models){
                definedModels = models
                next()
            })
        }   
    }))