通过promise加载node-orm2会导致CWD和模块找不到

时间:2014-02-17 22:08:32

标签: node.js express promise node-orm2

我有一个加载我的node-orm模型的函数:

function(server, connectionString){
    server.use(orm.express(connectionString,  {
        define: function (db, models, next) {
            loadIdeaDomain(db)
            next()          
        }   
    }))
    return this
}

还有另一块中间件(护照)需要在加载node-orm模型后运行...但是异步性质让我发疯。我可以将上述内容转换为承诺或等待它继续执行吗?

更新将loadIdeaDomain转换为承诺

var loadIdeaDomain = function(db){
    var ideaDomainPath = './idea-domain/idea-domain.js'
    console.log('loading ' + ideaDomainPath)
    var qLoad = Q.nbind(db.load, db)
    return qLoad(ideaDomainPath).then(function(){
        console.log('THEN')
        definedModels = db.models

        _.each(_.keys(db.models), function(modelName) {
            makeQPromises(db.models[modelName], modelName)
        })
        return db.models
    }, function(e){
        console.log('ERR')
        console.log(e)

    })
}

看起来它会起作用,除了我收到错误:

  

{[错误:无法找到模块   'C:\用户\托德\文件\网络\ nodeTest \ TRQ \ node_modules \ Q / .idea域/想法-domain.js']   代码:'MODULE_NOT_FOUND'}

所以看起来这可以追溯到node-orm库模块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;

1 个答案:

答案 0 :(得分:0)

好吧,我决定覆盖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();
}

然后

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()
            })
        }   
    }))

更新

并不完全 - 在移动之前似乎没有捕获和存储

相关问题