我有一个加载我的node-orm模型的函数:
function(server, connectionString){
server.use(orm.express(connectionString, {
define: function (db, models, next) {
loadIdeaDomain(db)
next()
}
}))
return this
}
还有另一块中间件(护照)需要在加载node-orm模型后运行...但是异步性质让我发疯。我可以将上述内容转换为承诺或等待它继续执行吗?
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;
答案 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()
})
}
}))
并不完全 - 在移动之前似乎没有捕获和存储