我有一个加载我的 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;