如何从模块加载器sails.js中排除文件在内部使用

时间:2015-09-07 04:15:57

标签: sails.js

我正在使用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);

1 个答案:

答案 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,因为它们是由模块加载器加载的!