我正在使用sails.js和我创建的一个名为def-inc的模块,通过mixins获得某种控制器和模型的继承。现在我想将mixins / traits存储在模型和控制器内的traits文件夹中。我不想用另一个文件夹污染api root来保存我的特性,所以ponint是否可以排除文件夹或文件,而不必修改核心文件?,或者至少是一种覆盖模块加载器并将其配置为执行此操作的方法。
这是我想要使用的路径结构的示例,但没有获得额外的模型/控制器。
.
|-- api
| |-- models
| | |-- traits
| | | |-- accountTraits.js
| | |-- User.coffee
| |-- controllers
| | |-- traits
| | | |-- restfullTraits.js
| | |-- UserController.js
现在,如果我这样做,我会得到一个名为accountTraits的额外模型(如果使用mysql适配器,还会有一个表)。
我已经检查了代码和文档,到目前为止,这似乎并不支持atm,但是因为它可能是一个常规模式(在sails,rails,laravel等之外)来使用其他对象模型域,但不是特定的数据库模型,我认为有人做了类似的事情。
注意:我知道为了简单起见,我可以将traits文件夹移动到api根路径,我不认为traits是服务的一部分,所以请避免回答,如果不可能,只需评论我的问题。
修改 基于 @ sgress454 提供的代码,我创建了这段代码,只是为了支持loadModel(以相同的方式工作),并且有一个fn可以修改以防我想要应用它对其他moduleLoader方法的行为。无论如何,我会留在这里以防万一有人需要它(但一定要upvote @ sgress454 :)
var liftOptions = rc('sails');
// Create the module loader override function
liftOptions.moduleLoaderOverride = function(sails, base) {
// Get a reference to the base loaders methods we want to extend
var baseLoadController = base.loadControllers;
var baseLoadModels = base.loadModels;
// Reusable fn to remove modules that match the defined pattern
var removeTraitsFromAutoLoadModules = function(cb, err, modules){
// Remove all modules whose identity ends with "traits"
modules = _.omit(modules, function(module, identity) {
return identity.match(/traits$/);
});
// Return the rest
return cb(err, modules);
};
return {
loadControllers: function (cb) {
baseLoadController(removeTraitsFromAutoLoadModules.bind(null, cb));
},
loadModels: function(cb) {
baseLoadModels(removeTraitsFromAutoLoadModules.bind(null, cb));
}
};
};
// Start server
sails.lift(liftOptions);
答案 0 :(得分:3)
您可以通过将moduleLoaderOverride
函数作为选项传递给sails.lift
来覆盖模块加载器。该函数有两个参数 - 对Sails实例的引用,以及包含原始模块加载器方法的对象,以便您仍然可以调用它们。该函数应该返回一个对象,该对象包含您要覆盖的模块加载器的方法。例如:
// bottom of app.js
// Get the lift options from the .sailsrc file
var liftOptions = rc('sails');
// Include lodash (you may have to npm install it), or else rewrite
// below without the _.omit call
var _ = require('lodash');
// Create the module loader override function
liftOptions.moduleLoaderOverride = function(sails, base) {
// Get a reference to the base loadControllers method we want to extend
var baseLoadControllers = base.loadControllers;
return {
loadControllers: function (cb) {
// Load all of the controllers
baseLoadControllers(function(err, controllers) {
// Remove all controllers whose identity starts with "traits"
controllers = _.omit(controllers, function(controller, identity) {return identity.match(/^traits/);});
// Return the rest
return cb(err, controllers);
});
}
};
};
// Lift Sails
sails.lift(liftOptions);
你必须使用node app.js
解除你的应用程序才能使用 - 没有办法将它放在常规配置文件中并使用sails lift
,因为它们是由模块加载器加载的!