Node.js 通过承诺加载节点-orm2,导致找不到CWD和模块
我有一个加载节点orm模型的函数: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 } 还有
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()
})
}
}))