如何以编程方式从回送应用程序分离模型?

我使用loopback而没有使用strongloop框架,这意味着我无法访问任何cli工具。 我能够成功地创build和启动一个回送服务器,并以这种方式定义/加载一些模型:

var loopback = require('loopback'); var app = loopback(); var dataSource = app.dataSource ( 'db', { adapter : 'memory' }); ); var UserModel = app.loopback.findModel('User'); UserModel.attachTo(dataSource); app.model(UserModel); /* ... other models loading / definitions */ // Expose API app.use('/api', app.loopback.rest()); 

我想实现的是能够在运行时从回送应用程序中分离出一个模型,所以它不再可用于其余的API或者回送对象(不需要重新启动节点脚本)。

我知道可以从cli中删除之前创build的模型定义: 在loopback.io中销毁一个模型 ,但是在我的情况下这是无效的,因为它所做的是删除在强循环引导时加载的json对象,在这里不适用。

我非常感谢这方面的帮助,我没有在strongloop API文档中find任何帮助。

免责声明:我是LoopBack的核心开发人员。

恐怕在运行时删除模型没有简单的方法,我们在#1590问题中跟踪这个请求。

所以它不再可用于其他API或回送对象

我们先来看看REST API。 为了从REST API中删除你的模型,你需要将它从强壮的远程维护的“共享类”列表中删除,然后清理caching的处理程序中间件。

 delete app.remotes()._classes[modelName]; delete app.remotes()._typeRegistry._types[modelName]; delete app._handlers.rest; 

当下一个请求进入时,LoopBack将创build一个新的REST处理程序中间件并重build路由表。

本质上,你需要撤销这个代码所做的工作。

为了从LoopBack JavaScript API中删除模型,您需要将其从应用程序registry维护的模型列表中删除:

 delete app.models[modelName]; delete app.models[classify(modelName)]; delete app.models[camelize(modelName)]; app.models.models.splice(app.models.indexOf(ModelCtor), 1); 

(这是撤销这个代码所做的工作)。

接下来,您需要从loopback-datasource-jugglerregistry中删除它:

 delete app.registry.modelBuilder.models[modelName]; 

注意事项:

  • 我没有运行/testing这个代码,它可能无法正常工作。
  • 它不处理被删除的模型与其他模型有关系的情况。
  • 它不通知环回组件浏览器有关API的变化