Node.js 如何以编程方式从环回应用程序中分离模型?
我使用的环回没有strongloop框架本身,这意味着我无法访问任何cli工具。我能够成功创建并启动环回服务器,并以这种方式定义/加载一些模型: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.
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中的更改通知环回组件资源管理器
非常感谢Bajtos。我将尽可能快地实现它,我一直在避免它,直到现在:)我想补充一下Bajtos的答案。您需要导入才能使用
classify
和camelize
。另外,这一行app.models.models.splice(app.models.indexOf(ModelCtor),1)代码>非常无用,会产生错误;删除它不会影响所需的更改。最重要的是,您需要在删除之前删除模型中的所有条目,因为它们不会从数据库条目中删除,所以请在删除代码的顶部添加以下行:app.models[modelName].destroyAll()代码>