2014-05-22 58 views
0

我有一個http post請求,但當我調用api時它會被觸發兩次。在節點服務器上調用api時,角度post請求運行兩次

基本上我知道節點是異步的,所以可能會等待運行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) ; 

}); 

任何想法將是巨大的

+0

你怎麼稱之爲$ http?你確定它沒有被觸發兩次? – Thilo

+0

你能澄清一下你的意思嗎?你的意思是'$ http POST'被調用兩次?或者您是否注意到兩個POST被髮送到您的服務器,即使您只希望瀏覽器創建一個POST? – sabhiram

+0

只是一次當我點擊按鈕 – tjhack

回答

1

這裏有幾個問題,我看到:

  1. 你不應該將用戶輸入的值連接到你的SQL查詢中(特別是bookingSql這裏),你可以通過這種方式接受SQL注入攻擊。

  2. 發生錯誤時(特別是在第一次查詢後),您沒有響應POST請求。

+0

您好歡呼的反饋。關於SQL我只是把它暫時放在那裏,因爲我打算創建一個單獨的庫,將調用存儲過程。 – tjhack

0

您是從布爾混合成功的意義爲字符串。您將它初始化爲"false",然後在出錯時將其設置爲false

此外,您的代碼中有很多控制路徑,最終不會從客戶端向POST發送響應。做一個response.end(),當你確定你已經完成了一些東西的發送,通常是一個好的做法。

+0

我相信res.send運行res.end。我看了一下expressjs代碼,它聲明this.end() – tjhack

+0

沒錯,但是你的POST處理程序中有控制路徑,它不會向請求者返回任何東西,因此添加了response.end():) – sabhiram

+0

所以在哪裏我做過res.send我需要添加res.end嗎? – tjhack

相關問題