Node.js 建模API:每行表示一个表。建议?
我有一个应用程序,将用户上传的电子表格存储为PostgreSQL中的表格。每次用户上传电子表格时,我都会在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中有指向不再存在的表的孤立表或记录是很常见的。我通过业务逻辑和清理任务来管理这一
数据集
表中创建一条记录,其中包含物理表名、别名和所有者。我可以使用
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。这就是为什么我要回传。好吧,这更有意义。我已经修复了要引用的标签,而不是。(删除现在不相关的原始注释)。