angularjs Node.js:系统发送了两次POST请求

im9ewurl  于 2022-11-21  发布在  Angular
关注(0)|答案(3)|浏览(128)

我通过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>

我注意到,如果瀑布式进程在某个地方“卡住”了,这意味着客户机无论如何都得不到对其请求的回答,POST请求似乎会自动再次发送(根据Firebug的说法,一旦浏览器超时)。根据Firebug的说法,第二个POST请求似乎不是由浏览器发送的,因此调用必须从其他地方发起。我通过检查数据库(多个文档具有相同的值,当然ObjectID除外)和监视node.js控制台窗口(我在其中输出传入的POST数据)找到了这个问题。一旦整个瀑布过程完成,因此客户端浏览器在一段时间后没有中止POST请求,并且res.send('200')执行,错误就不会发生(=没有多个数据库条目).谁能告诉我,是谁发起了第二个POST请求,我该如何停用它?干杯
伊戈尔

vecaoik1

vecaoik11#

尝试添加以下内容:

exports.createAuthor = function(req, res) {
if(req.method == 'POST' && req.url = 'REQUESTEDURL'){
    console.log('POST REQUEST INCOMING!!! '+req.body);
    async.waterfall([
      //TODO...
    ]);
}

问题可能是网站图标或其他资源正在请求

wgx48brx

wgx48brx2#

在这个问题上花了一些时间后,我发现这个错误似乎是基于缺少对客户端的回答(通过res.json,res.sendfile等)。因此,客户端似乎在一段时间后重新发送请求,从而第二次执行服务器端代码。在合理的时间内响应客户端解决了这个问题。很抱歉造成了混乱。

yb3bgrhw

yb3bgrhw3#

我“修正”了这一点,增加了

.get('/favicon.ico:1', (req, res) =>{
//do nothing because i dont care
  })

相关问题