Node.js 如何以编程方式从环回应用程序中分离模型?

Node.js 如何以编程方式从环回应用程序中分离模型?,node.js,rest,loopbackjs,strongloop,Node.js,Rest,Loopbackjs,Strongloop,我使用的环回没有strongloop框架本身,这意味着我无法访问任何cli工具。我能够成功创建并启动环回服务器,并以这种方式定义/加载一些模型: var loopback = require('loopback'); var app = loopback(); var dataSource = app.dataSource ( 'db', { adapter : 'memory' }); ); var UserModel = app.loopback.

我使用的环回没有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());
我想要实现的是能够在运行时将模型从环回应用程序中分离,因此它不再可以从RESTAPI或环回对象中使用(无需重新启动节点脚本)

我知道可以从cli中删除以前创建的模型定义: ,但这在我的例子中无效,因为它所做的是删除在strongloop引导时加载的json对象,这在这里不适用

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

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

恐怕在运行时没有简单的方法删除模型,我们正在跟踪中的此请求

因此,RESTAPI和环回对象都不再提供它

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

delete app.remotes()._classes[modelName];
delete app.remotes()._typeRegistry._types[modelName];
delete app._handlers.rest;
当下一个请求传入时,环回将创建一个新的REST处理程序中间件并重建路由表

本质上,您需要撤销由您完成的工作

为了从环回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);
(这将撤消由所做的工作)

接下来,您需要将其从环回数据源juggler注册表中删除:

delete app.registry.modelBuilder.models[modelName];
注意事项:

  • 我还没有运行/测试这段代码,它可能无法开箱即用
  • 它不处理删除的模型与其他模型有关系的情况
  • 它不会将API中的更改通知环回组件资源管理器

更新

现在有一个名为deleteModelByName的函数正是这样做的


非常感谢Bajtos。我将尽可能快地实现它,我一直在避免它,直到现在:)我想补充一下Bajtos的答案。您需要导入才能使用
classify
camelize
。另外,这一行
app.models.models.splice(app.models.indexOf(ModelCtor),1)非常无用,会产生错误;删除它不会影响所需的更改。最重要的是,您需要在删除之前删除模型中的所有条目,因为它们不会从数据库条目中删除,所以请在删除代码的顶部添加以下行:
app.models[modelName].destroyAll()