【问题标题】:LoopBack: How to Dynamically Create Custom REST Endpoints In Code (On The Fly)LoopBack:如何在代码中动态创建自定义 REST 端点(动态)
【发布时间】:2015-05-10 01:37:11
【问题描述】:

我们正在使用 LoopBack REST 框架来公开我们的数据库(和业务逻辑)。我们需要允许我们的客户在可以通过 REST 端点访问的数据库(单租户和多租户)中创建自定义表。所有客户都需要使用相同的通用(生产)REST 端点,这些端点将暴露在多台服务器上。但是,只有创建它们的客户才能访问自定义表和关联的 REST 端点。这意味着我们无法将自定义表的模型写入光盘。我们需要能够在生产 REST 端点的上下文中动态创建实际的 REST 端点。

问题:我们如何在代码中(动态)动态创建自定义 REST 端点,而不将模型写入磁盘上的 JSON 文件?

【问题讨论】:

    标签: rest dynamic endpoint loopbackjs strongloop


    【解决方案1】:

    您可以在模型的 JS 文件中创建 "remote method",这会在“运行时”添加 API 挂钩,尽管它是在启动时。也就是说,我认为您可以随时使用相同的函数来添加端点,而不仅仅是在启动时(尽管我从未尝试过):

    内部/common/models/MyModel.js

    module.exports = function(MyModel){
    
      // This is the endpoint for creating endpoints...
      MyModel.addEndpoint = function(name, method, cb) {
        // audit name and method...
    
        MyModel[name] = function(options, newCb) {
          // do whatever this endpoint should do...
          newCb(null, 'New endpoint success!');
        };
    
        MyModel.remoteMethod(
          name, 
          {
            accepts: [{arg: 'options', type: 'object'}], // or whatever you need...
            returns: {arg: 'message', type: 'string'}, // whatever it returns...
            http: {verb: method}
          }
        );
    
        cb(null, 'Success creating new endpoint!');
      };
    
      MyModel.remoteMethod(
        'addEndpoint', 
        {
          accepts: [
            {arg: 'name', type: 'string', http: {source: 'body'}},
            {arg: 'method', type: 'string', http: {source: 'body'}}
          ],
          returns: {arg: 'message', type: 'string'},
          http: {verb: 'post'}
        }
      );
    };
    

    【讨论】:

    • nice.. :).. 但是当您的应用重新启动时,所有这些动态添加的端点不会消失吗?也许您还需要以编程方式将 JS 代码添加到文件中..
    • 我不确定你的意思...这个 is JS 代码...在您的 LoopBack 应用程序中。端点是在每次应用启动时创建的。我还需要在哪里添加它们??
    • 有没有办法在运行时在代码中添加新的端点而不重新启动节点?例如,我们的用户可以通过我们的 UI 添加新表和更改现有表。但是,我们需要一个基于公共节点的 REST API。这意味着,一旦为特定客户的数据库更改了架构,我们需要 API 来公开每个客户的自定义架构,而无需借助客户特定的节点实例。
    • 或者,如果我们确实需要为每个客户数据库提供客户特定的节点实例,有没有一种方法可以直接将模式提供给 Loopback,而无需通过在 json 文件中创建复制模型的额外步骤磁盘。意思是,一切都来自数据库,并且模式配置保持完全动态
    【解决方案2】:

    我在环回中遇到了类似的问题。 我想出的解决方案是:

    1. 在我的数据库中维护一个表 [id INT, modelName VARCHAR, datasource VARCHAR, modelConfig TEXT],它可以保存任何其他表的模型定义。

    2. 在 loopback 中创建一个模型(称为 X)以提供对此表的 CRUD 操作。

    3. 在 X 中创建 remoteMethod 以更新应用程序对象中的模型并附加到任何数据源。 sn-ps的实现如下:

        X.updateModel = (modelName, cb) => {
          let app = X.app;
          if (modelName) {
            X.find({
              where: {
                name: modelName
              }
            }, function(err, result) {
              result.forEach(row => {
                let {
                  datasource,
                  modelConfig
                } = row;
                // Create a new model
                createAndAttachModel(app, datasource, JSON.parse(modelConfig));
              });
            });
            cb(null, "Created :" + modelName);
          }
        };
      X.remoteMethod('updateModel', {
        accepts: {arg: 'name', type: 'string'},
        returns: {arg: 'result', type: 'string'},
        http: {verb: 'get'},
      });
        let createAndAttachModel = (app, datasource, model) => {
          var loopback = require("loopback");
          try {
            // Create a new model object using the model incoming from the database
            let newModel = loopback.createModel(model);
            // Attach the model to an existing datasource
            app.model(newModel, {
              dataSource: null,
              public: true
            });
            let currDataSource = app.datasources[datasource];
            if (currDataSource) {
              newModel.attachTo(currDataSource);
            } else {
              console.error(datasource, "is not initialized");
            }
          } catch (error) {
            console.error(error);
          }
        };

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2011-01-02
      • 2023-02-14
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多