0

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

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

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

更新将 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:\Users\todd\Documents\web\nodeTest\trq\node_modules\q/.idea-domain/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;
4

1 回答 1

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

更新

不完全-在继续之前它似乎没有捕获和存储

于 2014-02-18T00:34:51.867 回答