如何以编程方式从环回应用程序中分离模型?
How to programmatically detach a model from a loopback application?
我使用的是没有 strongloop 框架本身的环回,这意味着我无法访问任何 cli 工具。我能够以这种方式成功地创建和启动环回服务器和 define/load 一些模型:
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 中删除之前创建的模型定义:
,但这在我的情况下无效,因为它所做的是删除在 strongloop 启动时加载的 json 对象,这在此处不适用。
我将非常感谢任何关于此的帮助,我在 strongloop API 文档中没有找到任何内容。
免责声明:我是 LoopBack 的核心开发人员。
恐怕没有简单的方法可以在运行时删除模型,我们正在 issue #1590 中跟踪此请求。
so it is not available from the rest API nor the loopback object anymore
我们先来看看RESTAPI。为了从 REST API 中删除您的模型,您需要将其从由 strong-remoting 维护的 "shared classes" 列表中删除,然后清理缓存的处理程序中间件。
delete app.remotes()._classes[modelName];
delete app.remotes()._typeRegistry._types[modelName];
delete app._handlers.rest;
当下一个请求到来时,LoopBack 将创建一个新的 REST 处理程序中间件并重建路由 table。
本质上,您需要撤消 this code 所做的工作。
为了从 LoopBack JavaScriptAPIs 中删除模型,您需要将其从应用程序注册表维护的模型列表中删除:
delete app.models[modelName];
delete app.models[classify(modelName)];
delete app.models[camelize(modelName)];
app.models.models.splice(app.models.indexOf(ModelCtor), 1);
(这是在撤消 this code 所做的工作)。
接下来,您需要将其从 loopback-datasource-juggler 注册表中删除:
delete app.registry.modelBuilder.models[modelName];
注意事项:
- 我没有run/tested这个代码,它可能无法开箱即用。
- 不处理删除的模型与其他模型有关系的情况。
- 它不会将 API
中的更改通知 loopback-component-explorer
更新
现在有一个名为 deleteModelByName 的函数可以做到这一点。
https://apidocs.strongloop.com/loopback/#app-deletemodelbyname
https://github.com/strongloop/loopback/pull/3858/commits/0cd380c590be7a89d155e5792365d04f23c55851
我使用的是没有 strongloop 框架本身的环回,这意味着我无法访问任何 cli 工具。我能够以这种方式成功地创建和启动环回服务器和 define/load 一些模型:
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 中删除之前创建的模型定义:
我将非常感谢任何关于此的帮助,我在 strongloop API 文档中没有找到任何内容。
免责声明:我是 LoopBack 的核心开发人员。
恐怕没有简单的方法可以在运行时删除模型,我们正在 issue #1590 中跟踪此请求。
so it is not available from the rest API nor the loopback object anymore
我们先来看看RESTAPI。为了从 REST API 中删除您的模型,您需要将其从由 strong-remoting 维护的 "shared classes" 列表中删除,然后清理缓存的处理程序中间件。
delete app.remotes()._classes[modelName];
delete app.remotes()._typeRegistry._types[modelName];
delete app._handlers.rest;
当下一个请求到来时,LoopBack 将创建一个新的 REST 处理程序中间件并重建路由 table。
本质上,您需要撤消 this code 所做的工作。
为了从 LoopBack JavaScriptAPIs 中删除模型,您需要将其从应用程序注册表维护的模型列表中删除:
delete app.models[modelName];
delete app.models[classify(modelName)];
delete app.models[camelize(modelName)];
app.models.models.splice(app.models.indexOf(ModelCtor), 1);
(这是在撤消 this code 所做的工作)。
接下来,您需要将其从 loopback-datasource-juggler 注册表中删除:
delete app.registry.modelBuilder.models[modelName];
注意事项:
- 我没有run/tested这个代码,它可能无法开箱即用。
- 不处理删除的模型与其他模型有关系的情况。
- 它不会将 API 中的更改通知 loopback-component-explorer
更新
现在有一个名为 deleteModelByName 的函数可以做到这一点。
https://apidocs.strongloop.com/loopback/#app-deletemodelbyname
https://github.com/strongloop/loopback/pull/3858/commits/0cd380c590be7a89d155e5792365d04f23c55851