gpt4 book ai didi

angularjs - mean.io 使用 http 请求堆栈 Angular 长时间运行的操作

转载 作者:可可西里 更新时间:2023-11-01 10:48:18 26 4
gpt4 key购买 nike

我正在使用 mean stack 开发一个 Web 应用程序,该应用程序对多个 mongo 数据库集合执行多个操作。

系统的总体意图是在多个系统之间执行数据同步。每个系统数据存储在不同的集合中。不用说,这些集合的文档具有共同的属性。

nodeJS 或 API 级别,我创建了 get 和 post 请求,它们将异步循环遍历主集合,并尝试将该集合上的文档与其他集合中的文档链接起来。这个过程自然需要几分钟。

可以链接的文档存储在不同的 mongodb 集合中。这些稍后将在另一个 Node js API 调用中处理。

设置 API 后,我将创建一个 Controller 和一个具有 Angular 的服务,以便连接到 api 并执行 api get 和 post 请求。

当我在 UI 中点击按钮执行此链接操作时,操作开始时不会阻塞浏览器,但最终浏览器会收到 ERR_EMPTY_RESPONSE,因为操作仍在正在经历,所以我从未真正调用过 response.end()

我认为可能的解决方案:

  1. 操作开始后立即回复:问题 -> 我需要确保此操作完成,以便对生成的集合进行其他调用。所以我完成了这个操作,以允许其他人对结果数据集进行操作。

我该怎么做才能避免浏览器在后台长时间运行的操作完成之前关闭连接?

代码:

html-> 用户点击开始链接记录的按钮:

<div>
<md-button aria-label="link all records" ng-click="vm.linkRecords()">
<md-icon class="mdi mdi-plus"></md-icon>Link Records
</md-button>
</div>

controller:canLink, canGrade都是boolean变量,所以当server在进行一个操作的时候,其他的都不能执行。操作完成后,它返回 true 并允许所有操作。

function linkRecords() {
$state.go('app.records.link');
}// END linkRecords page

$scope.$on('linkRecords', function(event, batchSize){
if ( canLink && canGrade) {
showToast("Started linking records");
canLink = 0;
canGrade = 0;
recordService.linkRecords(batchSize).then(function(finished){
canLink = finished;
canGrade = finished;
});
}else if ( !canLink ){
showToast('Cannot link records: - Currently undergoing grading records');
}else if ( !canGrade ){
showToast('Cannot link records: - Currently undergoing linking records');
}
});//END linkingRecords

服务

function linkRecords(batchSize){
return $http.get(urlRoot+'/link/:'+batchSize);
}//END linkRecords

Node js 接口(interface):

路由.js:

//link all records
app.post('/link/:batchSize', function(req, res){
var batchSize = req.params.batchSize;
functions.linkRecords(batchSize, function(callback){
res.end(true);
});
});//END linkRecords

函数.js:

linkRecords : function(batchSize, callback){
//link all records in all collections a batchsize at a time
async.parallel([
function(callback){
...open cursor for collection1 and loops over the collections to stitch with other collections.
},
function(callback){
...open cursor for collection2 and loops over the collections to stitch with other collections.
}
], function done(err, result){
callback();
});
}

最佳答案

听起来您需要更强大的后端基础架构来管理和跟踪这些长时间运行的任务。如果您知道这些操作将花费“很长时间”,可能是几秒、几分钟或更长时间,那么您必须设置某种类型的队列服务来运行这些任务、跟踪它们并处理错误情况。

API 服务器的唯一责任应该是:

  1. 接收用户请求
  2. 验证请求中的数据,如果不合法则立即返回错误
  3. 如果有效,将新作业插入到用于开始处理的队列中
  4. 然后,API 响应向用户返回一条“正在处理的消息”,可能带有一些 ID,用户可以使用这些 ID 在单独的 API 请求中跟踪进程。

可以为此过程实现的一组可能的 API:

POST /api/links - create a new link process
GET /api/links - display all currently running link processes
GET /api/links/:id - display a single link process
DELETE /api/links/:id - delete (or cancel) a running link process, if needed

您可以使用多种不同的队列技术来管理长时间运行的任务。如果你在 AWS 环境中,你可以使用 SQS queues .如果您的流程涉及多个步骤,您可以查看处理数据(或流程)管道的系统。 Luigi (从 spotify 开源)是一个示例服务,可用于处理非常简单的管道(即一步)到具有许多步骤和依赖关系的极其复杂的管道。

Here is a tutorial这分解了长时间运行的进程的问题,然后讨论了一些可能的实现。

关于angularjs - mean.io 使用 http 请求堆栈 Angular 长时间运行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com