【问题标题】:How to programmatically detach a model from a loopback application?如何以编程方式从环回应用程序中分离模型?
【发布时间】:2016-02-28 07:29:46
【问题描述】:

我正在使用没有 strongloop 框架本身的环回,这意味着我无法访问任何 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());

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

我知道可以删除之前从 cli 中创建的模型定义: Destroy a model in loopback.io,但这在我的情况下是无效的,因为它的作用是删除在强循环启动时加载的 json 对象,这在此处不适用。

非常感谢您对此提供的任何帮助,我在 strongloop API 文档中没有找到任何内容。

【问题讨论】:

    标签: node.js rest loopbackjs strongloop


    【解决方案1】:

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

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

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

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

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

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

    本质上,你需要撤消this code所做的工作。

    为了从 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);
    

    (这是撤消this code所做的工作)。

    接下来,您需要将其从 loopback-datasource-juggler 注册表中删除:

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

    注意事项:

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

    【讨论】:

    • 非常感谢 Bajtos。我会尽快实现它,直到现在我一直在避免它:)
    • 我想补充一下 Bajtos 的答案。您需要导入underscore.string 才能使用classifycamelize。此外,app.models.models.splice(app.models.indexOf(ModelCtor), 1); 这一行非常没用,会产生错误;删除它不会影响您想要的更改。最重要的是,您需要在删除之前删除模型中的所有条目,因为它们不会从数据库条目中删除,因此请在删除代码的顶部添加以下行:app.models[modelName].destroyAll();
    【解决方案2】:
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多