编辑:
我可能问过错误的问题。我今天早上简化了Node.js代码并且问题停止了。此问题似乎与使用deasync模块有关:
var done = false;
processGridCell(cell, layers, rowCount, colCount, datasetObject, function() { done = true});
deasync.loopWhile(function(){ return !done });
我猜测deasync用于防止函数耗尽内存。每次调用processGridCell都会保存一个MongoDB文档,并且调用大约12,000次。因为主节点线程永远不会为异步mongoose.save +回调节省时间,所以保存的对象永远不会GCed,并且进程耗尽内存。
我没有看到使用deasync的简单方法。我也不知道为什么使用deasync会导致客户端发出另一个POST请求,为什么删除它会阻止该请求首先发生。
我继承了一个节点/角度应用程序,我已经负责修复了一下。
发生的事情是,当提交表单时,它会调用Node.js函数,该函数需要10-20分钟才能运行。几分钟后,虽然我可以看到节点功能仍在运行,但是第二次从客户端提交相同的发布请求。我无法根除原因。此外,我在发出POST请求之前记录信息,但它只记录第一次,而不是第二次。
这是代码,显着删节。
HTML:
<header class="text-center" data-ng-include="'/modules/core/views/header.client.view.html'"></header>
<section>
<div class="get-grid-form">
<h2>Input Grid Size</h2>
<hr>
<form name="gridSizeForm" ng-controller="gridSizeCtrl" data-ng-submit="submitGridInput()" ng-class="{'has-error': gridSizeForm.myDecimal.$invalid}" >
<div class="grid-input-form">
<p>Other Irrelevent Content</p>
<div class="get-grid-form-button" ng-show="!isLoading&&isCalculating&&!isError">
<button type="submit" class="btn btn-primary" style="width: auto; margin: 2px;">OK</button>
<button type="button" class="btn btn-primary" ng-show="!isLoading" ng-click="cancel()"style="width: auto; margin: 2px;">Cancel</button>
</div>
</div>
</form>
</div>
</section>
角:
angular.module('module').controller('gridSizeCtrl', ['$scope', 'Upload',
'$http', '$window', '$stateParams', '$location',
function ($scope,Upload,$http,$window,$stateParams,$location)
{
$scope.submitGridInput = function() {
if ($scope.cellwidth === 'default') {
units = 'kilometers';
cellwidthval = 1;
}
$scope.upload( $scope.cellwidth, units, cellwidthval,
$location.search()['param']);
};
$scope.upload = function (cellwidth,units,widthval, params) {
$scope.isLoading = true;
console.log("This only logs once. The second request fires without this logging")
$http.post('/module/grid/create',
{ data:{someData: someData}
}).success(function(response)
{ //success code
}).error(function(response)
{ //error code
});
};
}
节点:
function moduleGridCreateFunction(req, res)
{
try
{
mongoose.find(
function(err)
{
mongoose.save(function(err)
{
mongoose.save(function(err)
{
//etc. etc. etc.
if(err)
{ res.status(400).jsonp('some error'); }
else
{ //do thing that takes 10 minutes
res.status(200).jsonp('success');
}
});
});
});
}
catch(err)
{ res.status(400).jsonp('error'); }
}