我通过MEAN环境中的表单将JSON POST数据发送到我的服务器。在服务器端,我使用异步库处理瀑布函数内部的数据,包括各种操作,例如: [...] - 为新作者创建数据库条目 - 为新书创建数据库条目 - 将新书与作者相关联(参考书籍ID) [...]
这是我的路由调用的方法,它处理相关的POST请求:
exports.createAuthor = function(req, res) {
console.log(req.url+' !!!POST REQUEST INCOMING!!! '+req.body);
async.waterfall([
function(callback){
//create Author db entry
},
function(parameter, callback){
//add author to additional directory (db action)
},
function(parameter, callback){
//create book db entry
},
function(parameter, callback){
//associate book to author (db action)
}
], function (err, result) {
console.log('DONE!!!');
res.send('200');
});
}
这是客户端AngularJS控制器代码:
searchApp = angular.module("searchApp",[]);
searchApp.controller('authorCreator', function ($scope,$http) {
$scope.tags = [];
$scope.sendAuthor = function(){
alert('I was called!');
$http({
method: 'POST',
url: '/newauthor/',
data: { 'authorname' : $scope.authorName,
'authordescription' : $scope.authorDescr,
'bookname' : $scope.bookName,
'tags' : $scope.tags }
})
.success(function(data){
//no actions yet
})
.error(function(){
//no actions yet
});
};
});
这是AngularJS表格:
<div ng-controller="authorCreator">
<form>
<p>Author name: <input ng-model="authorName"></p>
<p>Author description: <input ng-model="authorDescr"></p>
<p>Book name: <input ng-model="bookName"></p>
<p>Tags:<input ng-model="tags"></p>
<p><button ng-click="sendAuthor()">Send</button></p>
</form>
</div>
我注意到,如果瀑布过程是&#34;卡住&#34;在某个地方,意味着客户端没有得到任何答复,POST请求似乎是第二次自动发送(一旦浏览器根据firebug给出超时)。根据firebug,浏览器似乎没有发送第二个POST请求,因此必须从其他地方发起呼叫。 我通过检查数据库(多个文档具有相同的值,当然除了ObjectID)并监视node.js控制台窗口(我输出传入的POST数据)来发现。再次:一旦整个瀑布流程完成,因此客户端浏览器在一段时间后不会中止发布请求,并且res.send(&#39; 200&#39;)执行,则不会发生错误(=否多个数据库条目)。 任何人都可以告诉我,谁发起了第二个POST请求,我怎么能停用它? 干杯
伊戈尔
答案 0 :(得分:1)
尝试添加此内容:
exports.createAuthor = function(req, res) {
if(req.method == 'POST' && req.url = 'REQUESTEDURL'){
console.log('POST REQUEST INCOMING!!! '+req.body);
async.waterfall([
//TODO...
]);
}
问题可能是favicon或其他资源正在向
发出请求答案 1 :(得分:1)
在这个问题上花了一些时间后我发现,这个错误似乎是基于客户端的缺失答案(无论是通过res.json,res.sendfile,......)。因此,客户端似乎在一段时间后重新发送请求,从而第二次执行服务器端代码。在合理的时间内回复客户解决了这个问题。对不起,感到困惑。