在节点服务器上调用api时,Angular post请求运行两次

时间:2014-05-22 23:00:22

标签: node.js angularjs

我有一个http post请求,但是当我调用api时会被触发两次。

基本上我知道节点是异步的,所以可能正在等待运行sql来获取数据,但不知道如何绕过它。我的代码如下:

$http({ method: 'POST',
                            url: '/api/updateBooking',
                            data: JSON.stringify({'booking' : selectedItem }),
                            headers: {'Content-Type': 'application/json'}
                    }).success(function (data, status, headers, config) {
                       if (data == "true")
                       {

                           $scope.updateSuccess = true;
                                                     }
                    }).
                        error(function (data, status, headers, config) {
                        //hits this when unauthorized.
                        $scope.invalid = true;
                    });

因此,只要上面的代码运行,它将直接成功,然后是错误但没有返回数据。但是在它通过数据之后立即。

我的服务器代码在下面被称为

pp.post('/api/updateBooking', function(req,res)
{
     var booking = req.body.booking;
     var success = "false";

     console.log("req.booking=", booking.Date1);

     // just update the booking regardless as the booking is selected and is valid.
     console.log(booking);

     var bookingSql = 'SELECT * FROM Booking WHERE ' + booking.BookingID + '= ID ';

     connection.query(bookingSql, function(err,result){
        console.log(err);
        if(err) {success= false;}
        console.log('here result=', result);
        //if record found then ok to proceed
        if (result != null)
        {
            var updateBookingSQL = 'UPDATE Booking SET ? WHERE ID = ? ';
            var bookingFields  = {  Date1: booking.Date1,
                Date1AMPM: booking.Date1AMPM,
                Date2: moment(booking.date2).format('YYYY-MM-DD'),
                Date2AMPM: booking.Date2AMPM,
                 }


            console.log('booking fields', bookingFields);

            //go and do the update using the bookingID
            connection.query(updateBookingSQL, [bookingFields, booking.BookingID], function(err,result)
            {
                console.log(err);
                if (err) {success="false";}

                if (result != null)
                {
                    console.log('update booking result', result);
                    if (result.changedRows == 1)
                    {
                        console.log('changed row', result.changedRows);
                        success = "true";

                    }

                }
                res.send(success);
                console.log('result of update====', success);
            });

        }

     });
     console.log('success=', success) ;

});

任何想法都会很棒

2 个答案:

答案 0 :(得分:1)

我看到以下几个问题:

  1. 您不应该将用户输入的值连接到您的SQL查询中(特别是此处为bookingSql),您可以通过这种方式对SQL注入攻击进行打开。

    < / LI>
  2. 发生错误时(特别是在第一次查询后),您没有响应POST请求。

答案 1 :(得分:0)

您正在将成功的含义从布尔混合到字符串。您将其初始化为"false",然后在出错时将其设置为false

此外,您的代码中有许多控制路径,最终不会从客户端向POST发送响应。当你确定你已经完成了回送东西时,做一个response.end()通常是个好习惯。