如何在不在models文件夹中的情况下创建普通的sails模型

iCo*_*nor 15 javascript models node.js sails.js waterline

所以,

我正在为我的应用程序实现一个插件api,插件可以拥有自己的模型,想象一下.

SimplePlugin = {
    pluginName: 'simple',

    pluginConfig: {},

    SimpleModel: {

        attributes: {
            name: 'string'
        }

    } 

}
Run Code Online (Sandbox Code Playgroud)

所以,我需要能够每当它的需要来创建一个功能"一次性"的模式,它需要具有完全相同的功能等车型,让您自动获得的URL一样/simplePlugin/:idfind..等

谢谢

mar*_*ebl 12

在项目的当前状态下,你想做什么并不容易和Sails有点混乱.我指的是v0.10版本.你要做的是

  1. 将找到的模型定义SimplePlugin.SimpleModel注入sails.models
  2. 为模型注入虚拟控制器 _config: { rest: true }

请注意,我发布的代码示例取自我正在处理的自定义Sails挂钩,并假设访问sails以及在loadHooksSails初始化MiddlewareRegistry阶段/ 阶段之前要执行的代码示例(比较:lib/app/load.js).

1.注入模型定义

按照Sails v0.10中钩子提示,orm你必须:

  • 获取定义的模型和适配器api,将新模型合并到字典中
  • 通过规范化模型定义 sails.hooks.orm.normalizeModelDef
  • 将规范化的模型定义加载到Waterline中
  • 通过卸载现有的适配器连接 teardown
  • 重新初始化水线
  • 将初始化的Waterline集合展示给帆和全球范围sails.hooks.orm.prepareModels(先前:sails.hooks.orm.exposeModels,更改为:8d96895662)

因为你必须重新初始化Waterline并重新加载所有模型定义,我建议收集所有模型定义以进行注入并将它们传递给inject函数一次.下面的示例代码反映了这一点.

...

function injectPluginModels(pluginModels, cb) {
  // copy sails/lib/hooks/orm/loadUserModules to make it accessible here
  var loadUserModelsAndAdapters = require('./loadUserModules')(sails);

  async.auto({
    // 1. load api/models, api/adapters
    _loadModules: loadUserModelsAndAdapters,

    // 2. Merge additional models,  3. normalize model definitions
    modelDefs: ['_loadModules', function(next){
      _.each(additionModels, function(aditionModel) {
         _.merge(sails.models, additionalModel);
      });

      _.each(sails.models, sails.hooks.orm.normalizeModelDef);
      next(null, sails.models);
    }],

    // 4. Load models into waterline, 5. tear down connections, 6. reinitialize waterline
    instantiatedCollections: ['modelDefs', function(next, stack){
      var modelDefs = stack.modelDefs;

      var waterline = new Waterline();
      _.each(modelDefs, function(modelDef, modelID){
        waterline.loadCollection(Waterline.Collection.extend(modelDef));
      });

      var connections = {};

      _.each(sails.adapters, function(adapter, adapterKey) {
        _.each(sails.config.connections, function(connection, connectionKey) {
          if (adapterKey !== connection.adapter) return;
          connections[connectionKey] = connection;
        });
      });

      var toTearDown = [];

      _.each(connections, function(connection, connectionKey) {
        toTearDown.push({ adapter: connection.adapter, connection: connectionKey });
      });

      async.each(toTearDown, function(tear, callback) {
         sails.adapters[tear.adapter].teardown(tear.connection, callback);
      }, function(){
         waterline.initialize({
           adapters: sails.adapters,
           connections: connections
         }, next)
      });
    }],

    // 7. Expose initialized models to global scope and sails
    _prepareModels: ['instantiatedCollections', sails.hooks.orm.prepareModels]

  }, cb);
};

...
Run Code Online (Sandbox Code Playgroud)

允许你:

// Read your plugins
...

var pluginModels = // Get all the plugin models
injectPluginModels(pluginModels, function(){
  // Plugin models now available via global[pluginModel.globalId] and sails.models[pluginModel.identity]
});
Run Code Online (Sandbox Code Playgroud)

2.注入控制器

对于应通过蓝图方法公开的每个模型,您必须:

  • 创建具有匹配标识和已启用蓝图的控制器定义
  • 将控制器保存到 sails.controllers[controllerId]
  • 将控制器保存到 sails.hooks.controllers.middleware[controllerId]

Sails MiddlewareRegistry将自动获取这些对象中的控制器.

function mountBlueprintsForModels(pluginModels) {
  _.each(pluginModels, function(pluginModel){
    var controller = _.cloneDeep(pluginModel);
    controller._config = { rest: true };

    var controllerId = pluginModel.identity;

    if (!_.isObject(sails.controllers[controllerId])) {
      sails.controllers[controllerId] = controller;
    }

    if (!_.isObject(sails.hooks.controllers.middleware[controllerId])) {
      sails.hooks.controllers.middleware[controllerId] = controller;
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

3.在行动中

// E.g. in /api/hooks/plugins/index.js
/*
 * Module dependencies
 */

var async = require('async'),
    _ = require('lodash'),
    waterline = require('waterline');

module.exports = function(sails) {

  // injectPluginModels and mountBlueprintsForModels defined here
  ...

  return {

    initialize: function(cb) {
      sails.after('hook:orm:loaded', function() {
        yourNiftyPluginLoader(function(err, plugins) {
          // assuming plugin.models holds array of models for this plugin
          // customize for your use case
          var pluginModels = _.pluck(plugins, 'models');
          injectPluginModels(pluginModels, cb);
          mountBlueprintsForModels(pluginModels);
        });
      });
    }

  }

}
Run Code Online (Sandbox Code Playgroud)