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

Luc*_*pez 5 rest node.js strongloop loopbackjs

我在没有strongloop框架的情况下使用loopback,这意味着我无法访问任何cli工具.我能够成功创建并启动一个环回服务器,并以这种方式定义/加载一些模型:

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());
Run Code Online (Sandbox Code Playgroud)

我想要实现的是能够在运行时从环回应用程序中分离模型,因此它不再可用于其余API或环回对象(无需重新启动节点脚本).

我知道可以删除先前从cli中创建的模型定义: 在loopback.io中销毁模型,但这在我的情况下无效,因为它的作用是删除在strongloop引导时加载的json对象,这里不适用.

我非常感谢有关这方面的任何帮助,我在strongloop API文档中没有找到任何内容.

Mir*_*toš 1

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

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

所以它不再能从其余 API 或环回对象中获得

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

delete app.remotes()._classes[modelName];
delete app.remotes()._typeRegistry._types[modelName];
delete app._handlers.rest;
Run Code Online (Sandbox Code Playgroud)

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

本质上,您需要撤消此代码所做的工作。

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

delete app.models[modelName];
delete app.models[classify(modelName)];
delete app.models[camelize(modelName)];
app.models.models.splice(app.models.indexOf(ModelCtor), 1);
Run Code Online (Sandbox Code Playgroud)

(这会撤销此代码所做的工作)。

接下来,您需要从 Loopback-datasource-juggler 注册表中删除它:

delete app.registry.modelBuilder.models[modelName];
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 我还没有运行/测试这段代码,它可能无法开箱即用。
  • 它不处理删除的模型与其他模型有关系的情况。
  • 它不会通知loopback-component-explorer有关API的更改