Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 建模API:每行表示一个表。建议?_Node.js_Postgresql_Rest_Loopbackjs - Fatal编程技术网

Node.js 建模API:每行表示一个表。建议?

Node.js 建模API:每行表示一个表。建议?,node.js,postgresql,rest,loopbackjs,Node.js,Postgresql,Rest,Loopbackjs,我有一个应用程序,将用户上传的电子表格存储为PostgreSQL中的表格。每次用户上传电子表格时,我都会在数据集表中创建一条记录,其中包含物理表名、别名和所有者。我可以使用 GET domain.com/v1/Datasets/{id} 好吧,数据集中的行与物理表之间的关系不能由FK强制执行,或者至少我没有看到有人在PostgreSQL的信息架构上创建FKs,并且FKs不能删除表,或者可以吗?因此,在Dataset中有指向不再存在的表的孤立表或记录是很常见的。我通过业务逻辑和清理任务来管理这一

我有一个应用程序,将用户上传的电子表格存储为PostgreSQL中的表格。每次用户上传电子表格时,我都会在
数据集
表中创建一条记录,其中包含物理表名、别名和所有者。我可以使用

GET domain.com/v1/Datasets/{id}
好吧,
数据集
中的行与物理表之间的关系不能由FK强制执行,或者至少我没有看到有人在PostgreSQL的信息架构上创建FKs,并且FKs不能删除表,或者可以吗?因此,在
Dataset
中有指向不再存在的表的孤立表或记录是很常见的。我通过业务逻辑和清理任务来管理这一点

现在,要访问其中一个物理表,例如一个名为
nba_teams
的表,我需要在环回中声明一个NbaTeams模型并重新启动应用程序,然后使用

GET domain.com/v1/NbaTeams/{id}
但这无法扩展,特别是如果我已经有大约100上传一天。从我的立场来看,有两条路要走:

1.-创建一个模型,然后添加4个将表名作为字符串接受的自定义方法,并通过原始查询对该表名执行下一个CRUD操作。例如,要列出记录,请执行以下操作:

GET domain.com/v1/Datasets/getTable/NbaTeams
或者,更新一个团队

PUT domain.com/v1/Datasets/getTable/NbaTeams/{teamId}
这听起来不公平,但应该行得通

2.-创建一个接受表名作为字符串的自定义方法,该方法反过来创建一个临时模型,并将HTTP谓词和其余参数转发给它

dataSource.discoverAndBuildModels('nba_teams', {
    owner: 'uploader'
}, function (err, models) {
    console.log(models);
    models.NbaTeams.find(function (err, act) {
        if (err) {
            console.error(err);
        } else {
            console.log(act);
        }
        dataSource.disconnect();
    });
});
这第二个我还没有工作,我不知道它可能有多少开销,但我相信它是可行的


因此,在深入研究之前,我想问:有人处理过行到表的关系吗这方面的良好做法是什么

最后,我自己解决了一些棘手的问题,我想总有一天会有帮助的

我所做的是放置一个中间件(使用常规的express语法)来侦听/v1/dataset{id_dataset},动态创建模型,并将执行传递给下一个中间件

app.use('/v1/dataset:id_dataset', function(req, res, next) {
    var idDataset=req.params.id_dataset;
    app.getTheTable(idDataset,function(err,result) {
        if(err) { 
          console.error(err);
          res.json({"error":"couldn't retrieve related table"});
        } else {
          next();
        }
    });
});
app.gethetable
函数中,我正在动态创建一个模型,并在回调之前进行设置

app.getTheTable = function (idDataset, callback) {
    var Table = app.models.Dataset,
    modelName='dataset'+idDataset,
    dataSource;

    Table.findById(idDataset, function (err, resultados) {
        if (err) {
            callback(new Error('Unauthorized'));
        } else {
           if(app.models[modelName]) {
               callback(null,modelName); // model already exists
           } else {
               var theDataset = dataSource.createModel(modelName, properties, options);
               theDataset.settings.plural = modelName;
               theDataset.setup();

               app.model(theDataset);
               var restApiRoot = app.get('restApiRoot');
               app.use(restApiRoot, app.loopback.rest());

               callback(null, modelName);
           }
        }
    });
};

我知道,这是一种骇客行为,我相信重载restApiRoot中间件肯定会有某种性能损失,但最好在启动时创建500个模型来覆盖所有可能的数据集请求。

Hi@CraigRinger。是StrongLoop的一个框架。它为用户定义的模型提供了一个restful api、一个松散耦合的ORM(可以与api一起使用,不需要Altound)以及用于postgres、mysql和mongo(以及其他)的数据源连接器。主应用程序(上传电子表格的应用程序)使用条令作为ORM,但我想探索一个更轻的端点,在已经上传的电子表格上只提供CRUD。这就是为什么我要回传。好吧,这更有意义。我已经修复了要引用的标签,而不是。(删除现在不相关的原始注释)。